HDU 1879 继续畅通工程(Kruskal算法)

来源:互联网 发布:翻倍关注法优化 编辑:程序博客网 时间:2024/05/16 07:53

依旧最小生成树;
注意的是因为有些道路已经连通,那就利用cmp把它们先处理掉,再去处理边权小的边

畅通工程补完打卡~

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N=110;const int M=5000;struct edge{        int u,v,w;    int b;    }edges[M];    int pre[N];    int find(int i){        return pre[i]==i?i:pre[i]=find(pre[i]);    }    int cmp(edge a,edge b){        if(a.b!=b.b) return a.b>b.b;    else return a.w<b.w;    }    int kruskal(int n,int m){        int ans=0;        for(int i=1;i<=n;i++) pre[i]=i;        sort(edges+1,edges+m+1,cmp);        for(int i=1;i<=m;i++){            int x=find(edges[i].u);            int y=find(edges[i].v);            if(x!=y){            if(edges[i].b==0) ans+=edges[i].w;                pre[x]=y;               }        }        return ans;   }    int main(){    int n;    while(~scanf("%d",&n)&&n){        int m=(n-1)*n/2;        for(int i=1;i<=m;i++){            scanf("%d %d %d %d",&edges[i].u,&edges[i].v,&edges[i].w,&edges[i].b);        }        int ans=kruskal(n,m);        printf("%d\n",ans);    }}
0 0
原创粉丝点击