#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct edge
{
int a,b;
int d;
}r[50010];
int p[20010];
int root(int x)
{
if(p[x]==x)
return p[x];
return p[x] = root(p[x]);
}
void merge(int a,int b)
{
a = root(a);
b = root(b);
p[a] = b;
}
bool cmp(edge a,edge b)
{
return a.d>b.d;
}
int main()
{
int t;
int girl,boy,n,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&girl,&boy,&n);
for (int i = 0; i < n; i++)
{
scanf("%d%d%d",&r[i].a,&r[i].b,&r[i].d);
r[i].b += girl;
}
for (int i = 0; i < boy+girl; i++)
{
p[i] = i;
}
sort(r,r+n,cmp);
int minus = 0;
for (int i = 0; i < n; i++)
{
if(root(r[i].a) != root(r[i].b))
{
merge(r[i].a,r[i].b);
minus += r[i].d;
}
}
ans = 10000*(girl+boy);
ans -= minus;
printf("%d\n",ans);
}
return 0;
}
Poj 3723 Conscription -- 最大生成树(森林)
最新推荐文章于 2021-01-28 22:35:44 发布