//N个女孩,M个男孩,雇佣一个人的费用为10000
//男孩与女孩之间的关系为d,那么如果雇佣了一个,雇佣另一个的费用为10000-d
//每个人只能通过一种关系优惠
//问最少需要花费多少雇佣这些人
//很明显的最大生成树
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
const int maxn = 50010 ;
struct node
{
int u , v , w ;
}edge[maxn];
bool cmp(node a , node b)
{
return a.w > b.w ;
}
int F[maxn*2] ;
int find(int x)
{
if(F[x] == -1)return x ;
return F[x] = find(F[x]) ;
}
int r ;int n , m ;
int kruskal()
{
int ans = 0 ;
for(int i = 1;i <= r;i++)
{
int fu = find(edge[i].u) ;
int fv = find(edge[i].v) ;
if(fu == fv)continue ;
ans += edge[i].w ;
F[fu] = fv ;
}
return ans ;
}
int main()
{
//freopen("in.txt" , "r" , stdin) ;
int t ;
scanf("%d" , &t) ;
while(t--)
{
scanf("%d%d%d" , &n , &m , &r) ;
memset(F , -1 , sizeof(F)) ;
for(int i = 1;i <= r;i++)
{
scanf("%d%d%d" , &edge[i].u , &edge[i].v , &edge[i].w) ;
edge[i].v += maxn ;
}
sort(edge + 1 , edge + 1 + r , cmp) ;
int ans = kruskal() ;
cout<<(n+m)*10000 - ans<<endl;
}
return 0 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-29 15:55:18