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

● 无向图类

 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. xe5 android sample 中的 SimpleList 是怎样绑定的 [转]

    C:\Users\Public\Documents\RAD Studio\12.0\Samples\FireMonkeyMobile 例子中的绑定方式如下图: 1.拖拽一个listview到界面上,然 ...

  2. 【微软版本】redis 安装启动及设置密码<windows>

    redis 安装启动及设置密码<windows>   redis 1. 安装 1.1 下载解压包,直接解压到任意路径下即可 windows下载地址:ttps://github.com/MS ...

  3. 正则判断 文件名是否为zip格式

    var type = filename.match(/^(.*)(\.)(.{1,8})$/)[3].toUpperCase();

  4. (转载)通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔

    转载自:https://blog.csdn.net/lifetragedy/article/details/7708724 参考文章:tomcat以及常用web容器线程池的实现原理https://bl ...

  5. react事件中的事件对象和常见事件

    不管是在原生的js还是vue中,所有的事件都有其事件对象,该事件对象event中包含着所有与事件相关的信息,在react中,所有的事件也有其事件对象,在触发DOM上的某个事件时,就会产生一个事件对象. ...

  6. java安装1.8和1.7,报错:Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVers

    进入:C:\ProgramData\Oracle\Java\javapath; 删除:java.exe.javaw.exe.javaws.exe 删除:path的C:\ProgramData\Orac ...

  7. Oracle 官方文档地址

    官方文档地址: https://docs.oracle.com/cd/E11882_01/index.htm

  8. python:数据类型set

    一.集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变数据类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了 ...

  9. [UE4]扔枪后捡枪:Get Overlapping Actors

    一.搜索碰撞体是否碰撞到枪,使用Get Overlapping Actors,只搜索Class Filter设置的对象类型.Get Overlapping Actors没有Class Filter参数 ...

  10. android Information:Gradle tasks [:dl_version:generateDebugSources, :dl_version:generateDebugAndroidTestSources导致无法实现Preview功能

    Androidstudio 出现以下错误导致layout xml无法实现预览功能: Information:Gradle tasks [:dl_version:generateDebugSources ...