hdu 3371 Connect the Cities (Kruskal+ 并查集)

来源:互联网 发布:如何自己注册淘宝店铺 编辑:程序博客网 时间:2024/05/20 01:10
#include<stdio.h>#include<string.h>#include<stdlib.h>const int maxn = 255003;int fa[maxn] , rank[maxn] , n , m , k , p , q , c , tot , head[maxn] , ans , cnt;struct T{    int u , v , c , next;}edge[maxn * 2];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;}void addedge(int a , int b , int c){    edge[tot].u = a;    edge[tot].v = b;    edge[tot].c = c;    edge[tot].next = head[a];    head[a] = tot ++;}void init(){    for(int i = 1 ; i <= n ; i ++){        fa[i] = i;        rank[i] = 0;    }    tot = 0;    cnt = 0;    ans = 0;}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(){    for(int i = 0 ; i < m ; i ++){        if(Union(edge[i].u , edge[i].v)) {            ans += edge[i].c;        }    }    for(int i = 1 ; i < n ; i ++){        if(fa[i] == i)            cnt ++;    }    if(cnt > 1)        printf("-1\n");    else        printf("%d\n" , ans);}int main(){    int cases , a , b , c , temp[maxn];    scanf("%d" , &cases);    while(cases --){        scanf("%d%d%d" , &n , &m , &k);        init();        for(int i = 0 ; i < m ; i ++){            scanf("%d%d%d" , &a , &b , &c);            edge[i].u = a;            edge[i].v = b;            edge[i].c = c;        }        qsort(edge , m , sizeof(edge[0]) , cmp);        for(int i = 0 ; i < k ; i ++){            int t , vs , ve;            scanf("%d %d", &t , &vs);            for(int j = 1 ; j < t ; j ++){                scanf("%d" , &ve);                Union(vs , ve);           }        }        kruskal();    }    return 0;}