码迷,mamicode.com
首页 > 其他好文 > 详细

最小代价生成树(数据结构)

时间:2020-04-14 14:07:16      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:i++   并查集   kruskal   graph   结构   for   sort   最小   检测   

 1 //最小代价生成树
 2 //prim算法(稠密图):从与这棵树相连的边中选择最短的边,并将这条边及其所连顶点接入当前树中
 3 void Prim(MGraph g,int v0,int &sum) {
 4     int lowcost[maxsize],visit[maxsize],v;//lowcost存放当前树到其他顶点的最小权值的顶点
 5     int min,k;
 6     v=v0;
 7     for(int i=0; i<g.n; i++) {
 8         lowcost[i]=g.edges[v0][i];
 9         visit[i]=0;
10     }
11     visit[v0]=1;
12     sun=0;
13     for(int i=0; i<g.n-1; i++) {
14         min=INF;//INF是比所有权值都大的整数
15         for(int j=0; j<g.n; j++) {
16             if(visit[j]==0&&lowcost[j]<min) {
17                 min=lowcost[j];
18                 k=j;
19             }
20         }
21         v=k;
22         visit[k]=0;
23         sum+=min;
24         for(int j=0; j<g->n; j++) {
25             if(visit[j]==0&&lowcost[j]>g.edges[v][j]) {
26                 lowcost[j]=g.edges[v][j];
27             }
28         }
29     }
30 }
31 
32 //Kruskal算法(稀疏矩阵):每次找出候选边中权值最小的边,就将该边并入生成树中。
33 //重复此过程直到所有的边都被检测完为止
34 typedef struct Road {
35     int a,b,w;//分别表示两个顶点和路径的权值
36 };
37 Road road[maxsize];
38 int v[maxsize];//表示并查集
39 int getRoot(int a) {
40     if(a!=v[a])a=v[a];
41     return a;
42 }
43 void Kruskal(MGraph g,int &sum,Road road[]) {
44     int E,N;
45     E=g.e;
46     N=g.n;
47     for(int i=0; i<N; i++)v[i]=i;
48     sort(road,E);
49     for(int i=0; i<E; i++) {
50         int a=getRoot(road[i].a);
51         int b=getRoot(road[i].b);
52         if(a!=b) {
53             v[a]=b;
54             sum+=road[i].w;//求生成树的权值,这句并不是本算法的固定写法,也可改成其他
55         }
56     }
57 }

 

最小代价生成树(数据结构)

标签:i++   并查集   kruskal   graph   结构   for   sort   最小   检测   

原文地址:https://www.cnblogs.com/aiqinger/p/12697558.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!