最小生成树-Kruskal

来源:互联网 发布:猿课软件 编辑:程序博客网 时间:2024/04/30 16:08

O ( E lgE )


适用于 稀疏图

struct Edge{    int from,to,cost;}edge[m];int fa[n];   void init(){                // 不用并查集的kruskal算法是废的    for(int i=1;i<=n;i++)        fa[i]=i;}int find(int p){    while(fa[p]!=p){        fa[p]=fa[fa[p]];        p=fa[p];    }    return p;}bool connect(int x,int y){  // y加到x那,如果本来就在,返回false    x=find(x);    y=find(y);    if(x==y)return false;    fa[y]=x;    return true;}bool cmp(Edge a,Edge b){    return a.cost<b.cost;}int kruskal(){    int ans=0,tot=0;    init();    sort(edge,edge+m,cmp);    for(int i=0;i<m;i++){        if(connect(edge[i].from,edge[i].to)){            ans+=edge[i].cost;            tot++;        }    }    if(tot<n-1)return -1;    return ans;}


1 0
原创粉丝点击