/* 并查集的应用 再次提醒,poj很喜欢很喜欢卡cin,千万记得,一卡TLE就换scanf!(而且有时是,不管cin有没有取消和stdio的同步,都会被卡...) */ #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int MAX_E = 50010; const int MAX_R = 50010; typedef long long ll; int V, E; // 顶点和边数 int N, M, R; int X[MAX_R], Y[MAX_R], d[MAX_R]; int f[MAX_E]; struct edge { int u, v, cost; edge(int a = 0, int b = 0, int c = 0) { u = a; v = b; cost = c; } }; edge es[MAX_E]; void init() { for (int i = 0; i < V; i++) { f[i] = i; } } int find(int x) { return (f[x] == x ? x : f[x] = find(f[x])); } bool comp( const edge&e1, const edge&e2 ) { return e1.cost < e2.cost; } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; f[y] = x; // int u = find(x), v = find(y); // if (u == v) return; // f[v] = u; } bool same(int x, int y) { return find(x) == find(y); } void solve() { sort(es, es + E, comp); init (); int res = 0; for (int i = 0; i < E; i++) { edge e = es[i]; if (!same(e.u, e.v)) { unite(e.u, e.v); res += e.cost; } } res += 10000 * (N + M); cout << res << endl; } int main() { int k; scanf("%d", &k); while (k--) { scanf("%d%d%d", &N, &M, &R); V = N + M; E = R; for (int i = 0; i < R; i++) { scanf("%d%d%d", X+i, Y+i, d+i); es[i] = edge(X[i], N + Y[i], -d[i]); } solve(); } return 0; }