016最小生成树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

2.总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于Prim算法最小生成树的C语言实现示例: ```c #include <stdio.h> #include <limits.h> #define V 5 // 图中节点数 #define INF INT_MAX // 表示无穷大 // 在未包含的节点中,寻找距离树最近的节点 int minDistance(int dist[], int visited[]) { int min = INF, min_index; for (int v = 0; v < V; v++) { if (visited[v] == 0 && dist[v] <= min) { min = dist[v]; min_index = v; } } return min_index; } // 打印最小生成树 void printMST(int parent[], int graph[V][V]) { printf("Edge \tWeight\n"); for (int i = 1; i < V; i++) { printf("%d - %d \t%d \n", parent[i], i, graph[i][parent[i]]); } } void primMST(int graph[V][V]) { int parent[V]; // 用来存储最小生成树 int dist[V]; // 用来记录每个节点到最小生成树的距离 int visited[V]; // 用来记录每个节点是否已经在最小生成树中 // 初始化 for (int i = 0; i < V; i++) { dist[i] = INF; visited[i] = 0; } dist[0] = 0; // 从第一个节点开始 parent[0] = -1; // 根节点没有父节点 // 最小生成树包含V个节点 for (int count = 0; count < V - 1; count++) { int u = minDistance(dist, visited); // u是未包含的节点中距离最小的节点 visited[u] = 1; // 将节点u加入到最小生成树中 // 更新未包含的节点到最小生成树的距离 for (int v = 0; v < V; v++) { if (graph[u][v] && visited[v] == 0 && graph[u][v] < dist[v]) { parent[v] = u; dist[v] = graph[u][v]; } } } printMST(parent, graph); } int main() { int graph[V][V] = { { 0, 2, 0, 6, 0 }, { 2, 0, 3, 8, 5 }, { 0, 3, 0, 0, 7 }, { 6, 8, 0, 0, 9 }, { 0, 5, 7, 9, 0 } }; primMST(graph); return 0; } ``` 希望这个示例能够帮助你理解Prim算法实现过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值