poj2395 Kruskal最小生成树

来源:互联网 发布:php大神博客 编辑:程序博客网 时间:2024/05/04 04:55
/** * poj2395 最小生成树 Kruskal算法(加边法) * 就是个最小生成树,只是记录的是最大边的边长而已。环路检测可以用并查集。并查集好多次忘了要用父点做为操作点了,WA了好多次 */#include <cstdio>#include <algorithm>using namespace std;struct road{    int a;    int b;    int dist;}r[10001];int n,m;int father[2001];int points[2001];int max_len=0;bool cmp(const road &a,const road &b){    return a.dist < b.dist;}int min(int a,int b){    return a<b?a:b;}int getfather(int x){    if(x==father[x]){        return x;    }    else{        return father[x]=getfather(father[x]);    }}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;++i){        father[i] = i;        exist[i] = false;        points[i] = 1;    }    for(int i=1;i<=m;++i){        scanf("%d%d%d",&r[i].a,&r[i].b,&r[i].dist);    }    sort(r+1,r+m+1,cmp);    int s_idx,b_idx,fa,fb;    for(int i=1;i<=m && points[1]<n;++i){        if(i>1){            if(r[i-1].a == r[i].a && r[i-1].b == r[i].b){                continue;//重边检测            }        }        fa = getfather(r[i].a);        fb = getfather(r[i].b);        if(fa != fb){//检测有无环路            s_idx = min(fa,fb);            b_idx = fa+fb-s_idx;            father[b_idx] = getfather(s_idx);            points[s_idx] += points[b_idx];            if(max_len < r[i].dist){                max_len = r[i].dist;            }        }    }    printf("%d\n",max_len);    return 0;}

0 0
原创粉丝点击