题目大意:给出n1个女孩子和n2个男孩子之间的关系。你要把他们全部加入你的军队,求一个最小花费。
题目意思我说不清,大概就是最小生成树啦,不过我们要使这个生成树的权值最大,是一个最大生成树。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define Maxn 22000
#define Maxm 60000
#define INF 0x3f3f3f3f
using namespace std;
struct Edge{
int u,v,len;
}edge[Maxm];
int fa[Maxn];
int n1,n2,m;
int getfather(int x){
if (x!=fa[x]) return fa[x]=getfather(fa[x]);
return fa[x];
}
int Kruskal(){
int ret=0;
for (int i=0;i<=n1+n2;i++) fa[i]=i;
for (int i=1;i<=m;i++){
int u=getfather(edge[i].u);
int v=getfather(edge[i].v);
if (u==v) continue;
fa[v]=u;
ret+=edge[i].len;
}
return ret;
}
bool cmp(Edge a,Edge b){
return a.len>b.len;
}
int main(){
int cases,u,v,len;;
scanf("%d",&cases);
while (cases--){
scanf("%d%d%d",&n1,&n2,&m);
for (int i=1;i<=m;i++){
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].len);
edge[i].v+=n1;
}
sort(edge+1,edge+m+1,cmp);
printf("%d\n",10000*(n1+n2)-Kruskal());
}
return 0;
}