poj 1861 Network (kruskal 最小生成树)

来源:互联网 发布:淘宝企业开店收费 编辑:程序博客网 时间:2024/05/01 23:43
#include<stdio.h>#include<string.h>#include<stdlib.h>const int maxn = 15005;int n , m , fa[maxn] , rank[maxn];struct T{    int u , v , c;}edge[maxn * 2] , edge1[maxn * 2];void init(){    for(int i = 1 ; i <= n ; i ++){        fa[i] = i;        rank[i] = 0;    }}int cmp( const void *a , const void *b ){    struct T *cc = (T *)a;    struct T *dd = (T *)b;    if(cc->c != dd->c) return cc->c - dd->c;    else return dd->u - cc->u;}int find_set(int x){    if(fa[x] != x){        fa[x] = find_set(fa[x]);    }    return fa[x];}bool Union(int x , int y){    x = find_set(x);    y = find_set(y);    if(x == y) return false;    if(rank[x] > rank[y]){        fa[y] = x;    }    else{        if(rank[y] == rank[x]){            rank[y] ++;        }        fa[x] = y;    }    return true;}void kruskal(){    int k = 0;    int max = 0;    for(int i = 0 ; i < m ; i ++){        if(Union(edge[i].u , edge[i].v)) {            edge1[k ++] = edge[i];            if(max < edge[i].c) max = edge[i].c;        }    }    printf("%d\n", max);    printf("%d\n", k);    for (int i = 0; i < k; i++){        printf("%d %d\n", edge1[i].u, edge1[i].v);    }}int main(){    while(~scanf("%d%d" , &n , &m)){        init();        for(int i = 0 ; i < m ; i ++){            scanf("%d%d%d" , &edge[i].u , &edge[i].v , &edge[i].c);        }        qsort(edge , m , sizeof(edge[0]) , cmp);        kruskal();    }    return 0;}

原创粉丝点击