最小生成树Prim算法延时实现
图学习笔记索引
001自定义输入流In类实现
002背包数据类型Bag实现
003无向图数据类型实现
004基于图的深度优先搜索
005使用深度优先搜索找图中的所有连通分量
005-1基于深度优先搜索查找图中连通路径
006基于深度优先搜索判断图中是否存在环
007基于深度优先搜索判断一个无向图图是否是一个二分图
008广度优先搜索查找连通图中的最短路径
009有向图数据类型实现
010有向图的可达性
011带权重的无向边数据类型Edge实现
012加权无向图数据类型实现
013寻找有向环
014有向图中基于深度优先搜索的顶点排序
015查找、排序、符号表、散列表等算法实现(1)
本文参考《算法(第4版)》
1.依赖类
从文件中读取图的顶点关系。
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
点击文字获取:001自定义输入流In类实现
点击文字获取:优先队列MinPQ实现
最小生成树Prim算法延时实现:
package algorithms.graph;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import algorithms.rank.MinPQ;
public class LazyPrimMST {
private boolean marked[];
private Queue<Edge> mst;
private MinPQ<Edge> pq;
public LazyPrimMST(EdgeWeightedGraph G){
marked = new boolean[G.V()];
mst = new LinkedList<Edge>();
pq = new MinPQ<Edge>(10);
vist(G, 0);
while(!pq.isEmpty()){
Edge e = pq.delMin();
int v = e.either();
int w = e.other(v);
if(marked[v] && marked[w]) continue;
mst.add(e);
if(!marked[v]) vist(G, v);
if(!marked[w]) vist(G, w);
}
}
private void vist(EdgeWeightedGraph G, int v){
marked[v] = true;
for(Edge e : G.adj(v))
if(!marked[e.other(v)])
pq.insert(e);
}
public Iterable<Edge> edges(){
return mst;
}
public double weight(){
double weight = 0.0;
for(Edge e : edges())
weight += e.weight();
return weight;
}
public static void main(String[] args) throws IOException {
In in = new In("D:\\tinyEWG.txt");
EdgeWeightedGraph EWG = new EdgeWeightedGraph(in);
System.out.println(EWG);
LazyPrimMST mst = new LazyPrimMST(EWG);
System.out.println("最小生成树中的边:");
for(Edge e : mst.edges())
System.out.println(e);
System.out.println("最小生成树的权重之和:");
System.out.println(mst.weight());
}
}
输出:
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
最小生成树中的边:
0-7 0.16
7-1 0.19
0-2 0.26
2-3 0.17
7-5 0.28
5-4 0.35
2-6 0.40
最小生成树的权重之和:
1.81