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

 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 }

 

posted @ 2020-04-14 13:53  瓜瓜爱呱呱  阅读(838)  评论(0编辑  收藏  举报