刷题——Conscription POJ

来源:互联网 发布:thinkphp5 写的 cms 编辑:程序博客网 时间:2024/06/08 05:54
/*
招募n个女兵m个男兵,每个士兵的基础招募价格为10000
某个女兵和男兵有关系,招募了某个男兵那么招募对应的女兵根据这个关系可以减免一定的招募费,反之一样
每对关系只能用一次,那么可以把关系看成边,
类似最小生成树,改成最大生成树,基础招募费-最大生成树权重即是最小招募费用
*/
#include <stdio.h>
#include <algorithm>
using namespace std;
struct node{int u;int v;int w;};
int n,m,r;
int rt[50100];
node G[50100];
bool cmp(node a,node b){
    return a.w>b.w;
}
int find(int x){
    if(x!=rt[x])rt[x]=find(rt[x]);
    return rt[x];
}
int kr(){
    int res=0,num=0;
    for(int i=0;i<r;i++){
        int x=find(G[i].u);
        int y=find(G[i].v);
        if(x!=y){
            res+=G[i].w;
            rt[x]=y;
            if(++num==n+m-1)break;
        }
    }
    return res;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d %d %d",&n,&m,&r);
        for(int i=0;i<n+m;i++){
            rt[i]=i;
        }
        for(int i=0;i<r;i++){
            scanf("%d %d %d",&G[i].u,&G[i].v,&G[i].w);
            G[i].v+=n;
        }
        sort(G,G+r,cmp);
        printf("%d\n",(n+m)*10000-kr());
    }
    return 0;
}
原创粉丝点击