最小生成树 POJ3723 Conscription

来源:互联网 发布:淘宝联盟app推广 编辑:程序博客网 时间:2024/06/05 22:38

        题目大意:给出n1个女孩子和n2个男孩子之间的关系。你要把他们全部加入你的军队,求一个最小花费。

        题目意思我说不清,大概就是最小生成树啦,不过我们要使这个生成树的权值最大,是一个最大生成树。

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#define Maxn 22000#define Maxm 60000#define INF 0x3f3f3f3fusing 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;}


0 0
原创粉丝点击