▶ 书中第四章部分程序,加上自己补充的代码,包含无向 / 有向图类

● 无向图类

 package package01;

 import java.util.NoSuchElementException;
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Bag;
import edu.princeton.cs.algs4.Stack; public class class01
{
private static final String NEWLINE = System.getProperty("line.separator"); private final int V;
private int E;
private Bag<Integer>[] adj; public class01(int inputV)
{
if (inputV < 0)
throw new IllegalArgumentException("\n<Constructor> V < 0.\n>");
V = inputV;
E = 0;
adj = (Bag<Integer>[]) new Bag[V];
for (int v = 0; v < V; v++)
adj[v] = new Bag<Integer>();
} public class01(In in)
{
try
{
V = in.readInt();
if (V < 0)
throw new IllegalArgumentException("\n<Constructor> V < 0.\n>");
adj = (Bag<Integer>[]) new Bag[V];
for (int v = 0; v < V; v++)
adj[v] = new Bag<Integer>();
int E = in.readInt();
if (E < 0)
throw new IllegalArgumentException("\n<Constructor> E < 0.\n>");
for (int i = 0; i < E; i++)
{
int v = in.readInt();
int w = in.readInt();
//validateVertex(v);
//validateVertex(w);
addEdge(v, w);
}
}
catch (NoSuchElementException e)
{
throw new IllegalArgumentException("\n<Constructor> parameter error.\n");
}
} public class01(class01 G)
{
this(G.V()); // "this" 等价于 class01,即构造函数
E = G.E();
for (int v = 0; v < G.V(); v++) // 使用栈来遍历原图邻接表,遍历栈时建立新图的邻接表
{
Stack<Integer> edgeStack = new Stack<Integer>();
for (int w : G.adj[v])
edgeStack.push(w);
for (int w : edgeStack)
adj[v].add(w);
}
} public int V()
{
return V;
} public int E()
{
return E;
} public void addEdge(int v, int w)
{
//validateVertex(v);
//validateVertex(w);
adj[v].add(w);
adj[w].add(v);
E++;
} public Iterable<Integer> adj(int v) // 生成迭代器
{
//validateVertex(v);
return adj[v];
} public int degree(int v) // 计算顶点的度数
{
//validateVertex(v);
return adj[v].size();
} public String toString() // toString 接口
{
StringBuilder s = new StringBuilder();
s.append(V + " vertices, " + E + " edges " + NEWLINE);
for (int v = 0; v < V; v++)
{
s.append(v + ": ");
for (int w : adj[v])
s.append(w + " ");
s.append(NEWLINE);
}
return s.toString();
} /*
private void validateVertex(int v)
{
if (v < 0 || v >= V)
throw new IllegalArgumentException("\n<validateVertex> v < 0 || v >= V.\n>");
}
*/ public static void main(String[] args)
{
In in = new In(args[0]); // 输入第一行为顶点数,第二行为边数,以后每行为一条边的两个顶点
class01 G = new class01(in);
StdOut.println(G);
}
}

● 有向图类,只注释了与无向图不同的地方

 package package01;

 import java.util.NoSuchElementException;
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Bag;
import edu.princeton.cs.algs4.Stack; public class class01
{
private static final String NEWLINE = System.getProperty("line.separator"); private final int V;
private int E;
private Bag<Integer>[] adj;
private int[] indegree; // 每个顶点的入度 public class01(int inputV)
{
if (inputV < 0)
throw new IllegalArgumentException("\n<Constructor> V < 0.\n>");
V = inputV;
E = 0;
adj = (Bag<Integer>[]) new Bag[V];
for (int v = 0; v < V; v++)
adj[v] = new Bag<Integer>();
indegree = new int[V]; // 初始化入度
} public class01(In in)
{
try
{
V = in.readInt();
if (V < 0)
throw new IllegalArgumentException("\n<Constructor> V < 0.\n>");
adj = (Bag<Integer>[]) new Bag[V];
for (int v = 0; v < V; v++)
adj[v] = new Bag<Integer>();
int E = in.readInt();
if (E < 0)
throw new IllegalArgumentException("\n<Constructor> E < 0.\n>");
for (int i = 0; i < E; i++)
{
int v = in.readInt();
int w = in.readInt();
addEdge(v, w);
}
indegree = new int[V]; // 初始化入度
}
catch (NoSuchElementException e)
{
throw new IllegalArgumentException("\n<Constructor> parameter error.\n");
}
} public class01(class01 G)
{
this(G.V());
E = G.E();
for (int v = 0; v < G.V(); v++)
{
Stack<Integer> edgeStack = new Stack<Integer>();
for (int w : G.adj[v])
edgeStack.push(w);
for (int w : edgeStack)
adj[v].add(w);
}
for (int v = 0; v < V; v++) // 拷贝所有顶点的入度
indegree[v] = G.indegree(v);
} public int V()
{
return V;
} public int E()
{
return E;
} public void addEdge(int v, int w)
{
//validateVertex(v);
//validateVertex(w);
adj[v].add(w);
indegree[w]++; // 添加变的时候只添加一次,并更新重点的入度
E++;
} public Iterable<Integer> adj(int v)
{
//validateVertex(v);
return adj[v];
} public int outdegree(int v) // 顶点的出度
{
//validateVertex(v);
return adj[v].size();
} public int indegree(int v) // 顶点的入度
{
//validateVertex(v);
return indegree[v];
} public class01 reverse() // 反向图
{
class01 reverse = new class01(V); // 把复制构造函数改成不用栈即可
for (int v = 0; v < V; v++)
{
for (int w : adj(v))
reverse.addEdge(w, v);
}
return reverse;
} public String toString()
{
StringBuilder s = new StringBuilder();
s.append(V + " vertices, " + E + " edges " + NEWLINE);
for (int v = 0; v < V; v++)
{
s.append(v + ": ");
for (int w : adj[v])
s.append(w + " ");
s.append(NEWLINE);
}
return s.toString();
} /*
private void validateVertex(int v)
{
if (v < 0 || v >= V)
throw new IllegalArgumentException("\n<validateVertex> v < 0 || v >= V.\n>");
}
*/ public static void main(String[] args)
{
In in = new In(args[0]); // 输入第一行为顶点数,第二行为边数,以后每行依次为一条边的起点和终点
class01 G = new class01(in);
StdOut.println(G);
}
}

《算法》第四章部分程序 part 1的更多相关文章

  1. 《算法》第四章部分程序 part 19

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,有边权有向图的邻接矩阵,FloydWarshall 算法可能含负环的有边权有向图任意两点之间的最短路径 ● 有边权有向图的邻接矩阵 package p ...

  2. 《算法》第四章部分程序 part 18

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,在有权有向图中寻找环,Bellman - Ford 算法求最短路径,套汇算法 ● 在有权有向图中寻找环 package package01; impo ...

  3. 《算法》第四章部分程序 part 16

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,Dijkstra 算法求有向 / 无向图最短路径,以及所有顶点对之间的最短路径 ● Dijkstra 算法求有向图最短路径 package packa ...

  4. 《算法》第四章部分程序 part 15

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,Kruskal 算法和 Boruvka 算法求最小生成树 ● Kruskal 算法求最小生成树 package package01; import e ...

  5. 《算法》第四章部分程序 part 14

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,两种 Prim 算法求最小生成树 ● 简单 Prim 算法求最小生成树 package package01; import edu.princeton ...

  6. 《算法》第四章部分程序 part 10

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,包括无向图连通分量,Kosaraju - Sharir 算法.Tarjan 算法.Gabow 算法计算有向图的强连通分量 ● 无向图连通分量 pack ...

  7. 《算法》第四章部分程序 part 9

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,两种拓扑排序的方法 ● 拓扑排序 1 package package01; import edu.princeton.cs.algs4.Digraph ...

  8. 《算法》第四章部分程序 part 17

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,无环图最短 / 最长路径通用程序,关键路径方法(critical path method)解决任务调度问题 ● 无环图最短 / 最长路径通用程序 pa ...

  9. 《算法》第四章部分程序 part 13

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,图的前序.后序和逆后续遍历,以及传递闭包 ● 图的前序.后序和逆后续遍历 package package01; import edu.princeto ...

  10. 《算法》第四章部分程序 part 12

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,图的几种补充数据结构,包括无向 / 有向符号图,有权边结构,有边权有向图 ● 无向符号图 package package01; import edu. ...

随机推荐

  1. .net(C#)常见面试题

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...

  2. delphi中Time消息的使用方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  3. Redis环境安装

    Windows下: 到https://github.com/MicrosoftArchive/redis/releases下载: 下载完成后一步一步安装就行. 然后在安装一个可视化工具:https:/ ...

  4. .net 4.0 程序遇到 停止工作 appcrash ,kernelbase.dll 等提示

    经测试,删除*.exe.config 中 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v ...

  5. mysql查询优化之一:mysql查询优化常用方式

    一.为什么查询速度会慢? 一个查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中在“执行”阶段包含了大量为了检索数据到存储引擎 ...

  6. mysql配置文件修改

    mysql配置文件修改       mkdir –p /data/mysql chown -R mysql.mysql /data/mysql/     vim /etc/my.cnf [mysqld ...

  7. centos6.8下pptp客户端的安装配置

    原文: https://blog.csdn.net/zhang11321132/article/details/20612473 yum -y install ppp pptp pptp-setup ...

  8. git之win安装git和环境配置及常用命令总结

    12.windowns安装git和环境变量配置 11.git之常见命令总结 ===== 12.windowns安装git和环境变量配置 ; 转自 https://wuzhuti.cn/2385.htm ...

  9. Android应用启动会白屏一下的解决办法

    设置透明样式,如下:<activity android:name="com.hongfans.cvi.ui.MainActivity" android:configChang ...

  10. 在线学习和在线凸优化(online learning and online convex optimization)—基础介绍1

    开启一个在线学习和在线凸优化框架专题学习: 1.首先介绍在线学习的相关概念 在线学习是在一系列连续的回合(rounds)中进行的: 在回合,学习机(learner)被给一个question:(一个向量 ...