1. 程式人生 > >刷題——Conscription POJ

刷題——Conscription POJ

/*
招募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;
}