最小生成树

最小生成树是在n个点的图中选n-1条边构成树(每个点都满足能够互相达到,即直接连接或间接)

整一整kruskal

模板:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int fa[5005];
inline int father(int t){
    if(fa[t]!=t) fa[t]=father(fa[t]);
    return fa[t];
}
inline void u(int l,int r){
    int fl=father(l);
    int fr=father(r);
    if(fl!=fr) fa[fl]=fr; 
}
struct ed{
    int len;
    int begin,end;
}dis[200005];
inline bool cmp(ed a,ed b){
    return a.len<b.len;
}
int sum;
int num;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        dis[i].begin=x;
        dis[i].end=y;
        dis[i].len=z;
    }sort(dis+1,dis+1+m,cmp);
    for(int i=1;i<=m;i++){
        if(father(dis[i].begin)!=father(dis[i].end)){
            u(dis[i].begin,dis[i].end);
            sum+=dis[i].len;
            num++;
        }
        if(num==n-1){
            cout<<sum<<endl;
            return 0;
        }
    }
    cout<<"orz";
    return 0;
} 

 

posted @ 2019-04-26 19:18  _Alex_Mercer  阅读(184)  评论(0编辑  收藏  举报