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

● 无向图类

 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. Tablacus Explorer双心封装版

    Tablacus Explorer双心封装版 http://cloud.189.cn/t/mYj67j7r2Afq (TablacusExplorer17.3.27双心封装版.exe) http:// ...

  2. Java 内存溢出(java.lang.OutOfMemoryError)情况总结

    最近做一个项目,因为分了十几个模块,但是每次在Eclipse中启动Tomcat必须加载四五个模块,这样出现了 java.lang.OutOfMemoryError 原因是Eclipse中Tomcat设 ...

  3. R read.table 一个问题的解决

    Warning message: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : EOF within q ...

  4. PAT 乙级 1018 锤子剪刀布 (20) C++版

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  5. Kong网关介绍与安装小记

    本文主要为kong安装小记,系统环境为centos 6.7                                本文转载请注明出处 —— xiaoEight 介绍 Kong 是在客户端和(微 ...

  6. Springboot监控之二:Spring Boot Admin对Springboot服务进行监控

    概述 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖后, Spring Boot 会默认配置一些通用的监控,比如 jvm 监控.类加载.健 ...

  7. 学习笔记之Bokeh Data Visualization | DataCamp

    Bokeh Data Visualization | DataCamp https://www.datacamp.com/courses/interactive-data-visualization- ...

  8. [转][Java]尝试解决Java多行字符串的编辑问题

    转自:https://blog.csdn.net/jiuwuerliu/article/details/51207045 参考了:https://www.v2ex.com/amp/t/445522 除 ...

  9. [UE4]加入音效

  10. Hash算法原理的简单分析

    哈希计算就是努力的把比较大的数据存放到相对较小的空间中.最常见的哈希算法是取模法.下面简单讲讲取模法的计算过程.比如:数组的长度是5.这时有一个数据是6.那么如何把这个6存放到长度只有5的数组中呢.按 ...