其实是求最大生成树,把男生数加女生数乘一万后减最大生成树,女生标号分别为1到n,男生分别为n+1到n+m
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 50005
#define M 20005
int F[N];
int n, m;
struct edge
{
int u;
int v;
int dis;
}e[N];
void init()
{
int i;
for (i = 0; i <= n + m; i++)
F[i] = i;
}
bool cmp(edge e1, edge e2)
{
return e1.dis > e2.dis;
}
int find(int x)
{
if (F[x] != x)
F[x] = find(F[x]);
return F[x];
}
int main()
{
int r;
int t;
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&n,&m,&r);
init();
int i, j;
for (i = 1; i <= r; i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].dis);
e[i].v += n + 1;
e[i].u++;
}
sort(e + 1, e + r + 1, cmp);
int sum = 10000 * (n + m);
for (i = 1; i <= r; i++)
{
int fx = find(e[i].u);
int fy = find(e[i].v);
if (fx!=fy)
{
F[fx] = F[fy];
sum -= e[i].dis;
}
}
cout << sum << endl;
}
return 0;
}