圖-最小代價生成樹(數據結構)


 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM