最小產生樹演算法整理

來源:互聯網
上載者:User

                                      
轉載請註明出處:http://blog.csdn.net/wangjian8006

一個有 n 個結點的連通圖的產生樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖聯通的最少的邊。而最小產生樹是使這些找到的最小的邊權值之和達到最小。
最小產生樹有兩個演算法:prim和kruskal
prim的思想是不段的找點
kruskal的思想是不斷的找邊
下面來介紹這兩個演算法
prim簡單的描述下就是,在已知點集V中,找到所有V裡面的點的鄰邊,首次保證相鄰的點不在V裡,取權值最小的邊,再將相鄰點加進V,這樣不斷的找,最後找到的n-1條邊與n個頂點就是最小產生樹。
其實prim和dijkstra的思想差不多,都是一個貪心的策略,只不過在更新條件上改成,取鄰邊裡的最小邊就可以了

 

void prim(){int i,j,v;int d[MAXV],vis[MAXV];for(i=1;i<=n;i++){d[i]=map[1][i];vis[i]=0;}for(i=1;i<=n;i++){int min=inf;for(j=1;j<=n;j++)if(!vis[j] && d[j]<min){//找最小點加進來min=d[j];v=j;}vis[v]=1;for(j=1;j<=n;j++){if(!vis[j] && map[v][j]<d[j])//取鄰邊的最小邊d[j]=map[v][j];}}for(d[0]=0,i=1;i<=n;i++) d[0]+=d[i];printf("%d\n",d[0]);}

kruskal
他是一個不斷找邊的過程,並且是一個貪心的思路,既然是貪心,那麼肯定是從權值小的邊開始往已知邊集裡面添加,首先要將邊從小到大開始排序,然後從小到大試著將邊往裡面加,如果形成環我們就不加進來,如果不形成環就加進來,這樣加到n-1條邊為止,在判斷是否有環,我們要用到並查集,因為kruskal的對象是邊,所以適合稀疏圖

 

#include <iostream>using namespace std;#define MAXM 15010#define MAXV 1010typedef struct{int s,t,w;}Edge;int n,m,set[MAXV];Edge edge[MAXM];int find(int x){int rt;if(set[x]!=x){rt=find(set[x]);set[x]=rt;return set[x];}else return x;}bool Union(int a,int b){int fa,fb;fa=find(a);fb=find(b);if(fa==fb) return 0;//如果形成環就退出set[fa]=fb;return 1;}void kruskal(){int i,sum=0,cnt=0;for(i=1;i<=m;i++){if(Union(edge[i].s,edge[i].t)){sum+=edge[i].w;if(++cnt==(n-1)) break;//找到n-1條邊}}printf("%d\n",sum);}int cmp(const void * a,const void *b){return (*(Edge*)a).w-(*(Edge*)b).w;}int main(){int i;while(~scanf("%d%d",&n,&m)){for(i=0;i<=n;i++) set[i]=i;for(i=1;i<=m;i++){scanf("%d%d%d",&edge[i].s,&edge[i].t,&edge[i].w);}qsort(edge+1,m,sizeof(edge[0]),cmp);//將邊從小到大排序kruskal();}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.