带权重的无向边数据类型Edge实现
图学习笔记索引
图学习笔记索引(全部)
001自定义输入流In类实现
002背包数据类型Bag实现
003无向图数据类型实现
004基于图的深度优先搜索
005使用深度优先搜索找图中的所有连通分量
005-1基于深度优先搜索查找图中连通路径
006基于深度优先搜索判断图中是否存在环
007基于深度优先搜索判断一个无向图图是否是一个二分图
008广度优先搜索查找连通图中的最短路径
009有向图数据类型实现
010有向图的可达性
011带权重的无向边数据类型Edge实现
012加权无向图数据类型实现
本文参考《算法(第4版)》
1.加权无向图数据类型EdgeWeightedGraph实现
1)图文件读取
点击文字获取:流读取类In参考链接
从文件中读取图的顶点关系。
tinyEWG.txt文件中的第一行为顶点数,第二行为边数。
第三行到最后是两个相邻的顶点即边的权重:
8
16
4 5 0.35
4 7 0.37
5 7 0.28
0 7 0.16
1 5 0.32
0 4 0.38
2 3 0.17
1 7 0.19
0 2 0.26
1 2 0.36
1 3 0.29
2 7 0.34
6 2 0.40
3 6 0.52
6 0 0.58
6 4 0.93
2)代码实现
package algorithms.graph;
import java.io.IOException;
import algorithms.model.Bag;
/*
* 加权无向图数据类型实现
* */
public class EdgeWeightedGraph {
private final int V;
private int E;
private Bag<Edge>[] adj;
public EdgeWeightedGraph(int V){
this.V = V;
this.E = 0;
this.adj = (Bag<Edge>[])new Bag[V];
for(int v = 0; v < V; v++)
adj[v] = new Bag<Edge>();
}
public EdgeWeightedGraph(In in){
this(in.readInt());
int edges = in.readInt();
for(int e = 0; e < edges; e++){
int v = in.readInt();
int w = in.readInt();
double weight = Double.parseDouble(in.readStr());
adj[v].add(new Edge(v, w, weight));
adj[w].add(new Edge(w, v, weight));
}
}
public void addEdge(Edge e){
int v = e.either();
int w = e.other(v);
adj[v].add(e);
adj[w].add(e);
E++;
}
public int V(){ return this.V; }
public int E(){ return this.E; }
public Iterable<Edge> adj(int v){
return adj[v];
}
public Iterable<Edge> edges(){
Bag<Edge> bag = new Bag<Edge>();
for(int v = 0; v < V; v++)
for(Edge e : adj[v])
if(e.other(v) > v)
bag.add(e);
return bag;
}
public String toString(){
StringBuilder sb = new StringBuilder();
for(int v = 0; v < V; v++){
sb.append(v);
sb.append(" : ");
for(Edge e : adj(v)){
sb.append(e.toString());
sb.append(" | ");
}
sb.append("\n");
}
return sb.toString();
}
public static void main(String[] args) throws IOException {
In in = new In("D:\\tinyEWG.txt");
for(String v : in.getStr())
System.out.print(v + " ");
EdgeWeightedGraph EWG = new EdgeWeightedGraph(in);
System.out.println(EWG);
for(Edge e : EWG.edges())
System.out.println(e);
}
}
输出
8 16 4 5 0.35 4 7 0.37 5 7 0.28 0 7 0.16 1 5 0.32 0 4 0.38 2 3 0.17 1 7 0.19 0 2 0.26 1 2 0.36 1 3 0.29 2 7 0.34 6 2 0.40 3 6 0.52 6 0 0.58 6 4 0.93 0 : 0-6 0.58 | 0-2 0.26 | 0-4 0.38 | 0-7 0.16 |
1 : 1-3 0.29 | 1-2 0.36 | 1-7 0.19 | 1-5 0.32 |
2 : 2-6 0.40 | 2-7 0.34 | 2-1 0.36 | 2-0 0.26 | 2-3 0.17 |
3 : 3-6 0.52 | 3-1 0.29 | 3-2 0.17 |
4 : 4-6 0.93 | 4-0 0.38 | 4-7 0.37 | 4-5 0.35 |
5 : 5-1 0.32 | 5-7 0.28 | 5-4 0.35 |
6 : 6-4 0.93 | 6-0 0.58 | 6-3 0.52 | 6-2 0.40 |
7 : 7-2 0.34 | 7-1 0.19 | 7-0 0.16 | 7-5 0.28 | 7-4 0.37 |
5-7 0.28
4-5 0.35
4-7 0.37
4-6 0.93
3-6 0.52
2-3 0.17
2-7 0.34
2-6 0.40
1-5 0.32
1-7 0.19
1-2 0.36
1-3 0.29
0-7 0.16
0-4 0.38
0-2 0.26
0-6 0.58
2.总结
来源:CSDN
作者:栗子树6
链接:https://blog.csdn.net/m0_37692918/article/details/103819783