1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream>
using namespace std;
const int MAX = 210; int n, cnt, ret; int p[MAX], rank[MAX]; bool ext[MAX];
struct Edge { int from; int to; int weight; bool operator<(const Edge& edge) const { if (ext[from] == false || ext[to] == false) return false; if (ext[edge.from] == false || ext[edge.to] == false) return true; return weight < edge.weight; } } edge[MAX * MAX];
void Init() { for (int i = 0; i < 210; i++) { p[i] = i; rank[i] = 0; } }
void Link(int x, int y) { if (rank[x] < rank[y]) p[x] = y; else { p[y] = x; if (rank[x] == rank[y]) rank[x]++; } }
int Find(int x) { if (p[x] != x) p[x] = Find(p[x]); return p[x]; }
void Union(int x, int y) { Link(Find(x), Find(y)); }
bool Kruskal() { sort(edge, edge + cnt); int done = 0; Init(); for (int i = 0; i < cnt && done < n - 1; i++) { if (ext[edge[i].from] == false || ext[edge[i].to] == false) break; if (Find(edge[i].from) != Find(edge[i].to)) { done++; ret += edge[i].weight; Union(edge[i].from, edge[i].to); } } if (done == n - 1) return true; else return false; }
int main() { int t; int x, y, w; int nn, ee, m; scanf("%d", &t); while (t--) { cnt = 0; ret = 0; memset(ext, 0, sizeof(ext)); scanf("%d%d", &nn, &ee); n = nn; for (int i = 0; i < nn; i++) ext[i] = true; for (int i = 0; i < ee; i++) { scanf("%d%d%D", &x, &y, &w); edge[cnt].from = x; edge[cnt].to = y; edge[cnt].weight = w; cnt++; } scanf("%d%d", &nn, &ee); for (int i = n; i < n + nn; i++) ext[i] = true; n += nn; for (int i = 0; i < ee; i++) { scanf("%d%d%D", &x, &y, &w); edge[cnt].from = x; edge[cnt].to = y; edge[cnt].weight = w; cnt++; } scanf("%d", &m); n -= m; for (int i = 0; i < m; i++) { scanf("%d", &x); ext[x] = false; } if (Kruskal()) printf("%d\n", ret); else printf("what a pity!\n"); } return 0; }
|