Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 8568 Accepted
Submission(s): 2404
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 505; 8 int map[maxn][maxn]; 9 10 struct Node 11 { 12 int a; 13 int b; 14 int value; 15 }node[25005]; 16 17 bool cmp(Node n1, Node n2) 18 { 19 return n1.value < n2.value; 20 } 21 22 int fa[maxn]; 23 24 void init(int n) 25 { 26 for(int i = 0; i <= n; i++) 27 fa[i] = i; 28 } 29 30 int find(int x) 31 { 32 return fa[x] == x ? x : fa[x]=find(fa[x]); 33 } 34 35 int sum; 36 37 void unin(int u, int v, int value) 38 { 39 int fu = find(u); 40 int fv = find(v); 41 if(fu != fv) 42 { 43 sum += value; 44 fa[fu] = fv; 45 } 46 } 47 48 int main() 49 { 50 int t; 51 int n, m, k; 52 int p, q, c; 53 int x, y, num; 54 scanf("%d",&t); 55 while(t--) 56 { 57 scanf("%d %d %d",&n, &m, &k); 58 init(n); 59 memset(map, -1, sizeof(map));//题目告诉两个城市之间的距离可能为零 60 for(int i = 0; i < m; i++) 61 { 62 scanf("%d %d %d",&p, &q, &c); 63 if(map[p][q] == -1) 64 map[p][q] = map[q][p] = c; 65 else if(c < map[p][q]) 66 map[p][q] = map[q][p] = c; 67 } 68 int l = 0; 69 for(int i = 1; i < n; i++) 70 { 71 for(int j = i+1; j <= n; j++) 72 { 73 if(map[i][j] != -1) 74 { 75 node[l].a = i; 76 node[l].b = j; 77 node[l++].value = map[i][j]; 78 } 79 } 80 } 81 sort(node, node+l, cmp); 82 sum = 0; 83 for(int i = 0; i < k; i++) 84 { 85 scanf("%d %d",&num, &x); 86 num--; 87 while(num--) 88 { 89 scanf("%d",&y); 90 unin(x, y, 0); 91 } 92 } 93 for(int i = 0; i < l; i++)//把l写成k wrong的泪啊。。。。 94 unin(node[i].a,node[i].b,node[i].value); 95 bool flag = true; 96 int find1 = find(1); 97 for(int i = 2; i <= n; i++) 98 { 99 if(find(i) != find1) 100 { 101 flag = false; 102 break; 103 } 104 } 105 if(flag) 106 printf("%d\n",sum); 107 else 108 printf("-1\n"); 109 } 110 return 0; 111 }
hdu3371Connect the Cities---最小生成树kruskal,布布扣,bubuko.com
hdu3371Connect the Cities---最小生成树kruskal
原文:http://www.cnblogs.com/zhanzhao/p/3683593.html