/*
并查集的应用
再次提醒,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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步