poj3723

来源:互联网 发布:南昌怎么样 知乎 编辑:程序博客网 时间:2024/04/29 20:03

其实是求最大生成树,把男生数加女生数乘一万后减最大生成树,女生标号分别为1到n,男生分别为n+1到n+m


#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;#define  N 50005#define  M 20005int 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;}

原创粉丝点击