#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX_N 20002
#define MAX_E 50001
struct edge{
int u, v, cost;
};
int par[MAX_N];
int Rank[MAX_N];
edge es[MAX_E];
int V, E;
bool compare(const edge &e1, const edge &e2)
{
return e1.cost<e2.cost;
}
void init(int N)
{
for (int i = 0; i<N; i++)
{
par[i] = i;
Rank[i] = 0;
}
}
int find(int x)
{
if (par[x] == x)
return x;
else
return par[x]=find(par[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x == y) return;
if (Rank[x]>Rank[y])
swap(x, y);
par[x] = y;
Rank[x]++;
}
bool same(int x, int y)
{
x = find(x);
y = find(y);
return x == y;
}
int krus()
{
sort(es, es + E, compare);
init(V);
int ret = 0;
for (int i = 0; i<E; i++)
{
if (same(es[i].u, es[i].v) == false)
{
ret += es[i].cost;
unite(es[i].u, es[i].v);
}
}
return ret;
}
int main()
{
int count;
int N, M;
scanf("%d", &count);
for (int i = 0; i<count; i++)
{
scanf("%d%d%d", &N, &M, &E);
for (int j = 0; j<E; j++)
{
int v, cost;
scanf("%d%d%d", &es[j].u, &v, &cost);
es[j].v = v + N;
es[j].cost = -cost;
}
V = M + N;
printf("%d\n", V * 10000 + krus());
}
return 0;
}
POJ 3723 Conscription 并查集 + Kruskal
最新推荐文章于 2024-04-27 13:04:40 发布