最小生成树。。
连接给的所有点,保证图中没有环
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
int n,i,j,k;
int t,m;
int f[20020];
int root(int p)
{
if(f[p]==-1) return p;
else return f[p]=root(f[p]);
}
void merge(int a,int b)
{
a=root(a);
b=root(b);
f[a]=b;
}
struct node{
int a,b,len;
}p[50010];
bool comp(node a,node b)
{
return a.len>b.len;
}
int main()
{
scanf("%d",&t);
int x,y,d;
while(t--){
memset(f,-1,sizeof(f));
memset(p,0,sizeof(p));
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<k;i++){
scanf("%d%d%d",&x,&y,&d);
p[i].a=x;
p[i].b=y+n;
if(d>p[i].len)
p[i].len=d;
}
sort(p,p+k,comp);
int sum=0;
for(i=0;i<k;i++)
{
if(root(p[i].a)!=root(p[i].b))
{
merge(p[i].a,p[i].b);
sum+=p[i].len;
}
}
printf("%d\n",(n+m)*10000-sum);
}
}