码迷,mamicode.com
首页 > 其他好文 > 详细

poj3723Conscription kruskal模板水题

时间:2015-08-04 13:40:12      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:最大生成树

//N个女孩,M个男孩,雇佣一个人的费用为10000 
//男孩与女孩之间的关系为d,那么如果雇佣了一个,雇佣另一个的费用为10000-d
//每个人只能通过一种关系优惠
//问最少需要花费多少雇佣这些人
//很明显的最大生成树
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
const int maxn = 50010 ;
struct node
{
    int u , v , w ;
}edge[maxn];
bool cmp(node a , node b)
{
    return a.w > b.w ;
}
int F[maxn*2] ;
int find(int x)
{
    if(F[x] == -1)return x ;
    return F[x] = find(F[x]) ;
}
int r ;int n , m ;
int kruskal()
{
    int ans = 0 ;
    for(int i = 1;i <= r;i++)
    {
        int fu = find(edge[i].u) ;
        int fv = find(edge[i].v) ;
        if(fu == fv)continue ;
        ans += edge[i].w ;
        F[fu] = fv ;
    }
  return ans ;
}
int main()
{
    //freopen("in.txt" , "r" , stdin) ;
    int t ;
    scanf("%d" , &t) ;
    while(t--)
    {
        scanf("%d%d%d" , &n , &m , &r) ;
        memset(F , -1 , sizeof(F)) ;
        for(int i = 1;i <= r;i++)
        {
            scanf("%d%d%d" , &edge[i].u , &edge[i].v , &edge[i].w) ;
            edge[i].v += maxn ;
        }
        sort(edge + 1 , edge + 1 + r , cmp) ;
        int ans =  kruskal()  ;
        cout<<(n+m)*10000 - ans<<endl;
    }
    return 0 ;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

poj3723Conscription kruskal模板水题

标签:最大生成树

原文地址:http://blog.csdn.net/cq_pf/article/details/47274305

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!