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;}