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

● 无向图类

 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. excel技巧--批量生成工资条

    要想生成如上图的工资条,快速的方法如下: 1.在工资表右侧建立一升序数字列,完成后再复制该列,重复粘贴一次在该列底部.2.对该表排序:“开始”-->“排序和筛选”-->自定义排序.在对话框 ...

  2. HTML+CSS补充

    1. HTML+CSS补充 - 布局: <style> .w{ width:980px;margin:0 auto; } </style> <body> <d ...

  3. 用R语言实现对不平衡数据的四种处理方法

    https://www.weixin765.com/doc/gmlxlfqf.html 在对不平衡的分类数据集进行建模时,机器学**算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带 ...

  4. DP Big Event in HDU

    Big Event in HDU Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) T ...

  5. android手机截屏、录屏

    1. 手动截屏,通过其他第三方软件发送截图,或者从手机取出截图 2. 使用命令截图,将截图保存到手机,再拉取到电脑 #!/bin/sh #运行 sh screenshot name picName=$ ...

  6. es中的一些知识点记录

    1. forcemerge接口 强制段合并,设置为1时,是期望最终只有1个索引段.但实际情况是,合并的结果是段的总数会减少,但仍大于1,可以多次执行强制合并的命令. 设置的的目标值越小.合并消耗的时间 ...

  7. CentOS 7安装Oracle 11gR2以及设置自启动(2)

    6.创建表空间和用户授权 (1).连接数据库 $ sqlplus / as sysdba (2).创建数据库表空间 语法: create tablespace 表空间名 datafile ‘物理地址( ...

  8. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

  9. Sublime下MarkDown插件实现编辑和实时预览并转换成HTML格式

    最近在使用markdown做笔记,编辑器Sublime Text3用起来很轻巧,现在让他支持markdown的语法并且可以实时预览. 安装准备——安装Package Control Package C ...

  10. centos 7 修改host文件

    centos7与之前的版本都不一样,修改主机名在/ect/hostname 和/ect/hosts 这两个文件控制 首先修改/etc/hostname vi /etc/hostname 打开之后的内容 ...