《算法》第四章部分程序 part 12
▶ 书中第四章部分程序,包括在加上自己补充的代码,图的几种补充数据结构,包括无向 / 有向符号图,有权边结构,有边权有向图
● 无向符号图
package package01; import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Graph;
import edu.princeton.cs.algs4.ST; public class class01
{
private ST<String, Integer> st; // 字符串转索引
private String[] keys; // 索引转字符串
private Graph graph; public class01(String filename, String delimiter)
{
st = new ST<String, Integer>();
for (In in = new In(filename); !in.isEmpty();) // 收集符号,存入集合,编号
{
String[] a = in.readLine().split(delimiter);
for (int i = 0; i < a.length; i++)
{
if (!st.contains(a[i]))
st.put(a[i], st.size());
}
}
keys = new String[st.size()];
for (String name : st.keys())
keys[st.get(name)] = name;
graph = new Graph(st.size());
for (In in = new In(filename); in.hasNextLine();) // 再读一次,建图
{
String[] a = in.readLine().split(delimiter);
int v = st.get(a[0]);
for (int i = 1; i < a.length; i++)
{
int w = st.get(a[i]);
graph.addEdge(v, w);
}
}
} public boolean contains(String s)
{
return st.contains(s);
} public int indexOf(String s)
{
return st.get(s);
} public String nameOf(int v)
{
return keys[v];
} public Graph graph()
{
return graph;
} public static void main(String[] args)
{
String filename = args[0]; // 输入符号图(邻接表)的文件名和分隔符
String delimiter = args[1];
class01 sg = new class01(filename, delimiter);
for (Graph graph = sg.graph(); StdIn.hasNextLine();)
{
String source = StdIn.readLine(); // 再输入需要查询的顶点
if (sg.contains(source))
{
int s = sg.indexOf(source);
for (int v : graph.adj(s))
StdOut.println(" " + sg.nameOf(v));
}
else
StdOut.println("input not contain '" + source + "'");
}
}
}
● 有向符号图,与无向情形仅有方法名不同
package package01; import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Digraph;
import edu.princeton.cs.algs4.ST; public class class01
{
private ST<String, Integer> st;
private String[] keys;
private Digraph graph; public class01(String filename, String delimiter)
{
st = new ST<String, Integer>();
for (In in = new In(filename); !in.isEmpty();)
{
String[] a = in.readLine().split(delimiter);
for (int i = 0; i < a.length; i++)
{
if (!st.contains(a[i]))
st.put(a[i], st.size());
}
}
keys = new String[st.size()];
for (String name : st.keys())
keys[st.get(name)] = name;
graph = new Graph(st.size());
for (In in = new In(filename); in.hasNextLine();) // 再读一次,建图
{
String[] a = in.readLine().split(delimiter);
int v = st.get(a[0]);
for (int i = 1; i < a.length; i++)
{
int w = st.get(a[i]);
graph.addEdge(v, w);
}
}
} public boolean contains(String s)
{
return st.contains(s);
} public int indexOf(String s)
{
return st.get(s);
} public String nameOf(int v)
{
return keys[v];
} public Digraph digraph()
{
return graph;
} public static void main(String[] args)
{
String filename = args[0];
String delimiter = args[1];
class01 sg = new class01(filename, delimiter);
for (Digraph graph = sg.digraph(); StdIn.hasNextLine();)
{
String t = StdIn.readLine();
for (int v : graph.adj(sg.indexOf(t)))
StdOut.println(" " + sg.nameOf(v));
}
}
}
● 有权边结构
package package01; import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Edge; public class class01 implements Comparable<Edge>
{
private final int v;
private final int w;
private final double weight; public class01(int inputV, int inputW, double inputWeight)
{
if (inputV < 0 || inputW < 0 || Double.isNaN(inputWeight))
throw new IllegalArgumentException("\n<Construtor> v < 0 || w < 0 || weight == NaN.\n");
v = inputV;
w = inputW;
weight = inputWeight;
} public double weight()
{
return weight;
} public int either()
{
return v;
} public int other(int vertex)
{
if (vertex == v)
return w;
if (vertex == w)
return v;
throw new IllegalArgumentException("\n<other> No such point.\n");
} @Override
public int compareTo(class01 that)
{
return Double.compare(weight, that.weight);
} public String toString()
{
return String.format("%d-%d %.5f", v, w, weight);
} public static void main(String[] args)
{
class01 e = new class01(12, 34, 5.67);
StdOut.println(e);
}
}
● 有边权有向图
package package01; import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.Bag;
import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.Edge; public class class01
{
private static final String NEWLINE = System.getProperty("line.separator");// 换行,按操作系统适配 private final int V;
private int E;
private Bag<Edge>[] adj; public class01(int inputV)
{
if (inputV < 0)
throw new IllegalArgumentException("\n<Constructor> V < 0.\n");
V = inputV;
E = 0;
adj = (Bag<Edge>[]) new Bag[V];
for (int v = 0; v < V; v++)
adj[v] = new Bag<Edge>();
} public class01(int inputV, int inputE)
{
this(inputV);
if (inputE < 0)
throw new IllegalArgumentException("\n<Constructor> E < 0.\n");
for (int i = 0; i < E; i++) // 添加 E 条边,随机权重
{
int v = StdRandom.uniform(V);
int w = StdRandom.uniform(V);
Edge e = new Edge(v, w, Math.round(100 * StdRandom.uniform()) / 100.0);
addEdge(e);
}
} public class01(In in)
{
this(in.readInt());
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();
Edge e = new Edge(v, w, in.readDouble());
addEdge(e);
}
} public class01(class01 G)
{
this(G.V());
E = G.E();
for (int v = 0; v < G.V(); v++)
{
Stack<Edge> reverse = new Stack<Edge>();// 用栈保存原图遍历得到的边,吐栈是回复顺序
for (Edge e : G.adj[v])
reverse.push(e);
for (Edge e : reverse)
adj[v].add(e);
}
} public int V()
{
return V;
} public int E()
{
return E;
} public void addEdge(Edge e)
{
int v = e.either();
int w = e.other(v);
adj[v].add(e);
adj[w].add(e);
E++;
} public Iterable<Edge> adj(int v)
{
return adj[v];
} public int degree(int v)
{
return adj[v].size();
} public Iterable<Edge> edges()
{
Bag<Edge> list = new Bag<Edge>();
for (int v = 0; v < V; v++)
{
boolean selfLoop = false; // 注意两条自边只算一个自环
for (Edge e : adj(v))
{
if (e.other(v) == v)
{
if (!selfLoop)
list.add(e);
selfLoop = !selfLoop;
}
if (e.other(v) > v) // 索引控制,防止反复添加同一条边
list.add(e);
}
}
return list;
} public String toString()
{
StringBuilder s = new StringBuilder();
s.append(V + " " + E + NEWLINE);
for (int v = 0; v < V; v++)
{
s.append(v + ": ");
for (Edge e : adj[v])
s.append(e + " ");
s.append(NEWLINE);
}
return s.toString();
} public static void main(String[] args)
{
In in = new In(args[0]);
class01 G = new class01(in);
StdOut.println(G);
}
}
《算法》第四章部分程序 part 12的更多相关文章
- 《算法》第四章部分程序 part 19
▶ 书中第四章部分程序,包括在加上自己补充的代码,有边权有向图的邻接矩阵,FloydWarshall 算法可能含负环的有边权有向图任意两点之间的最短路径 ● 有边权有向图的邻接矩阵 package p ...
- 《算法》第四章部分程序 part 18
▶ 书中第四章部分程序,包括在加上自己补充的代码,在有权有向图中寻找环,Bellman - Ford 算法求最短路径,套汇算法 ● 在有权有向图中寻找环 package package01; impo ...
- 《算法》第四章部分程序 part 16
▶ 书中第四章部分程序,包括在加上自己补充的代码,Dijkstra 算法求有向 / 无向图最短路径,以及所有顶点对之间的最短路径 ● Dijkstra 算法求有向图最短路径 package packa ...
- 《算法》第四章部分程序 part 15
▶ 书中第四章部分程序,包括在加上自己补充的代码,Kruskal 算法和 Boruvka 算法求最小生成树 ● Kruskal 算法求最小生成树 package package01; import e ...
- 《算法》第四章部分程序 part 14
▶ 书中第四章部分程序,包括在加上自己补充的代码,两种 Prim 算法求最小生成树 ● 简单 Prim 算法求最小生成树 package package01; import edu.princeton ...
- 《算法》第四章部分程序 part 10
▶ 书中第四章部分程序,包括在加上自己补充的代码,包括无向图连通分量,Kosaraju - Sharir 算法.Tarjan 算法.Gabow 算法计算有向图的强连通分量 ● 无向图连通分量 pack ...
- 《算法》第四章部分程序 part 9
▶ 书中第四章部分程序,包括在加上自己补充的代码,两种拓扑排序的方法 ● 拓扑排序 1 package package01; import edu.princeton.cs.algs4.Digraph ...
- 《算法》第四章部分程序 part 17
▶ 书中第四章部分程序,包括在加上自己补充的代码,无环图最短 / 最长路径通用程序,关键路径方法(critical path method)解决任务调度问题 ● 无环图最短 / 最长路径通用程序 pa ...
- 《算法》第四章部分程序 part 13
▶ 书中第四章部分程序,包括在加上自己补充的代码,图的前序.后序和逆后续遍历,以及传递闭包 ● 图的前序.后序和逆后续遍历 package package01; import edu.princeto ...
随机推荐
- 《JavaScript设计模式与开发》笔记 2.this指针
1.作为对象方法调用 2.作为普通函数调用 1.作为普通函数进行调用 2.将函数赋值给一个对象 3.callback内部的this指向了window 4.解决callback内部的this问题 3.构 ...
- idea14导入eclipse项目并部署运行完整步骤
idea14导入eclipse项目并部署运行完整步骤 2015年05月12日 14:08:04 阅读数:40456 首先说明一下:idea里的project相当于eclipse里的workspace, ...
- Flask--异常处理
异常处理: abort(404)-捕获HTTP抛出的统一状态码 @app.errorhandler-捕获全局异常错误码,捕获异常错误 @app.route("/demo4") de ...
- SQL Server CONVERT() 日期转换为新数据类型的 通用函数
http://www.w3school.com.cn/sql/func_convert.asp
- elasticsearch 口水篇(1) 安装、插件
一)安装elasticsearch 1)下载elasticsearch-0.90.10,解压,运行\bin\elasticsearch.bat (windwos) 2)进入http://localho ...
- 【Graphite学习】系列学习文章-【转】
Graphite 系列 #2:Carbon 和 Whisper GRAPHITE SERIES #1: PROVISION HARDWARE GRAPHITE SERIES #2: CARBON &a ...
- “Hello world! ”
12.1第一篇笔记 Python 方向:1.web全栈 2.人工智能 (java基础) 3. 爬虫开发 4.数据分析(金融) 6个月学习:需完成8-10万行代码的目标 下一步学习方向 ...
- appium的log详细分析
下面介绍appium日志的大概分析 //启动appium服务成功2017-03-24 11:22:49:218 - info: [Appium] Welcome to Appium v1.6.3201 ...
- 客户端负载均衡Feign之三:Feign补充
在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...
- 廖雪峰Java5集合-2List-2编写equals方法
List是一种有序链表: List内部按照放入元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 boolean contains(Object o) 是否包含某个元素 int indexOf( ...