首页 > 代码库 > 图论-最小生成树-Kruskal算法

图论-最小生成树-Kruskal算法

有关概念:

  最小生成树:在连通图G中,连接图G所有顶点且总权最小的边构成的树

思路:
  首先对边按权从小到大排序,紧接着枚举每一条边,如果两个结点的祖先结点不同(并查集),则连上此边,直到边数等于结点数-1即可
  邻接矩阵输入,用类邻接表存储方式存边
 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define MAXN  5 #define MAXM  6 int father[MAXN],n,m,cnt,ans,a,b; 7 struct node 8 { 9     int u,v,val;10 }edge[MAXM];11 int cmp(node a,node b)12 {13     return a.val<b.val;14 }15 int find(int x)//并查集+路径压缩16 {17     if(father[x]==x)return x;18     else return father[x]=find(father[x]); 19 }20 int main()21 {22     scanf("%d",&n);23     for(int i=1;i<=n;i++)24         father[i]=i;25     for(int i=1;i<=n;i++)26     {27         for(int j=1;j<=n;j++)28         {29             scanf("%d",&a);30             if(a==0)continue;31              edge[++cnt].u=i;32              edge[cnt].v=j;33             edge[cnt].val=a;34         }35     }36     sort(edge+1,edge+cnt+1,cmp);37     m=cnt;38     cnt=1;39     for(int i=1;i<=m;i++)40     {41         a=find(edge[i].u);42         b=find(edge[i].v);43         if(a==b)continue;44         else//连边45         {46             father[b]=a;47             cnt++;48             ans+=edge[i].val;49             if(cnt==n)break;50         }51     }52     printf("%d",ans);//最小生成树权值和53     return 0;54 }
*参考:
http://baike.baidu.com/link?url=kGlXMlnImpXrmDw8uojP7JDeRsPUoZE4YYXNvANyAnfp6cDaQRxkoGV5DY20BU2_ZkkN5TF8ip-djtE5nQ2Lfq
http://baike.baidu.com/link?url=w9DUdZ7x1mt5N8865ZFlthXcYL_LHQU1gOPN8LTEIJVAnu-JO68eL4Oz6zbpmAVa

图论-最小生成树-Kruskal算法