题意:
男生女生有关系,如果以此关系雇佣这对男女就能少花val元钱。问最少能用多少元把他们都雇佣
(注意每次减价对于一个人来说只能凭借一种关系作用)
思路:
最大生成树,尽可能的减少花费
数组别开小了
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <set>
#include <cstring>
using namespace std;
int father[20005];
typedef long long ll;
struct node
{
int st;
int ed;
int val;
}edge[50005];
int n,m,r;
int sum=0,temp=0;
int cmp(node x,node y)
{
return x.val>y.val;
}
void init()
{
for(int i=0;i<=20001;i++)
father[i]=i;
return ;
}
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void kruskal(ll money)
{
ll res=0;
for(int i=1;i<=r;i++)
{
int root1=find(edge[i].st);
int root2=find(edge[i].ed);
if(root1!=root2)
{
res+=edge[i].val;
father[root1]=root2;
}
}
cout<<money-res<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
init();
scanf("%d%d%d",&n,&m,&r);
ll all=(n+m)*10000;
for(int i=1;i<=r;i++)
{
scanf("%d%d%d",&edge[i].st,&edge[i].ed,&edge[i].val);
edge[i].ed+=n;
}
sort(edge+1,edge+1+r,cmp);
kruskal(all);
}
return 0;
}