Kruskal模板

  • 适合稀疏图
  • 时间复杂度:O(E*logE)
  • 把边权从小到大,枚举判断此边连接的点是否已经加入生成树,没有的话就加入这条边,否则不加。
  •  1 #include <bits/stdc++.h>
     2 using namespace std;
     3 struct node{
     4     int u,v,w;
     5 }e[10005];
     6 int fa[10005];
     7 int cmp(node x,node y){
     8     if(x.w<y.w) return 1;
     9     return 0;
    10 }
    11 int getfather(int x){
    12     if(fa[x]!=x){
    13         fa[x]=getfather(fa[x]);
    14     }
    15     return fa[x];
    16 }
    17 int main(){
    18     int n,m,tot=0;
    19     cin>>n;
    20     int p=n*n;
    21     for(int i=1;i<=n;i++){
    22         for(int j=1;j<=n;j++){
    23             e[++tot].u=i;
    24             e[tot].v=j;
    25             cin>>e[tot].w;
    26         }
    27     }
    28     sort(e+1,e+p+1,cmp);
    29     for(int i=1;i<=p;i++){
    30         fa[i]=i;    
    31     }
    32     int fu,fv,s=0,ans=0;
    33     for(int i=1;i<=p;i++){
    34         fu=getfather(e[i].u);
    35         fv=getfather(e[i].v);
    36         if(fu!=fv){
    37             fa[fu]=fv;
    38             ans+=e[i].w;
    39         }    
    40     }
    41     cout<<ans<<endl;
    42     return 0;
    43 } 

     

posted @ 2019-08-10 11:17  song_jian  阅读(235)  评论(0编辑  收藏  举报