传送门:poj3723
题意挺简单的,其实想明白了就是求最大生成树,这种转化和抽象建图的思维挺好的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int f[100005];
int getf(int k)
{
return k==f[k]?k:f[k]=getf(f[k]);
}
struct node{
int u,v,w;
}q[50005];
bool cmp(node a,node b)
{
return a.w>b.w;
}
int main()
{
int o;
int n,m,r;
scanf("%d",&o);
while(o--)
{
while(~scanf("%d%d%d",&n,&m,&r))
{
memset(q,0,sizeof(q));
//vector<int>v[105];
for(int i=0;i<r;i++)
{
int t;
scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w);
q[i].v+=n;
}
for(int i=0;i<n+m;i++)
f[i]=i;
sort(q,q+r,cmp);
int i=-1,t=1;
int x,y;
long long ans=10000*(m+n);
for(int i=0;i<r;i++)
{
x=getf(q[i].u);
y=getf(q[i].v);
if(x==y)
continue;
f[y]=x;
ans-=q[i].w;
//printf("%d %d ",i,q[i].w);
}
//printf("%d ",t);
printf("%d\n",ans);
}
}
return 0;
}