Description:

Windy有一个国家,他想建立一个军队来保护他的国家。 他召集了N个女孩和M男孩,想把他们雇佣成为他的士兵。 要无偿雇佣士兵,必须支付10000元。 女孩和男孩之间有一些关系,而Windy可以利用这些关系来降低他的成本。 如果女孩x和男孩y有关系,并且其中一个已经被收集,Windy可以以10000-d的价格雇佣另一个。 现在给予女孩和男孩之间的所有关系,你的任务是找到Windy必须支付的最少的钱。 请注意,雇佣一名士兵时只能使用一种关系。

Input:
第一行输入是测试用例的数量。
每个测试用例的第一行包含三个整数N,M和R.
然后是R行,每行包含三个整数xi,yi和di。
每个测试用例前都有一个空白行。

1≤N,M≤10000
0≤R≤50000,0≤xi<N,0≤yi<M,0 <di <10000
Output:
对于每个测试用例,都会在一行中输出答案。

Sample Input:

5 5 8
    4 3 6831
    1 3 4583
    0 0 6592
    0 1 3063
    3 3 4975
    1 3 2049
    4 2 2104
    2 2 781

5 5 10
    2 4 9820
    3 2 6236
    3 1 8864
    2 4 8326
    2 0 5156
    2 0 1463
    4 1 2439
    0 4 4373
    3 4 8889
    2 4 3133

Sample Input:
    71071
    54223

Analysis:

首先,我们可以发现这是一个二分图!

然后,看了很久,我们发现好像这个二分图的性质并没有什么用。

如果有一些点被一些线连在了一起(连通块),那我们发现,只要有一个点花10000块钱买了下来,剩下的点都可以得到优惠,优惠的价格便是边权。

那相当于,一条边能对连接他的两个端点产生优惠,换而言之,其中一个点的价格便变成了(10000-边权)。

于是我们发现,便是在一个连通块里求最小生成树(边权改为10000-输入值的边权),在加上连通块的个数即可。

Code:

 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define maxn 10005
#define maxe 50005
using namespace std;
int T,n,m,ec,blk,ans;
int fa[maxn<<],vis[maxn<<];
struct E{
int u,v,val;
inline int operator < (const E &a)const{
return val<a.val;
}
}e[maxe];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
} int mst()
{
int sum=;RG fu,fv;
rep(i,,n+m) fa[i]=i;
sort(e+,e++ec);
rep(i,,ec)
{
fu=find(e[i].u),fv=find(e[i].v);
if(fu!=fv) sum+=e[i].val,fa[fu]=fv;
}
return sum;
} int main()
{
T=read();
while(T--)
{
n=read(),m=read(),ec=read();
rep(i,,ec) e[i].u=read()+,e[i].v=read()+n+,e[i].val=-read();
ans=mst();
int bl;blk=;
rep(i,,n+m)
{
bl=find(i);
if(!vis[bl]) vis[bl]=,blk++;
}
cout<<blk*+ans<<endl;
memset(vis,,sizeof(vis));
}
return ;
}

Conscription [POJ3723] [最小生成树]的更多相关文章

  1. 【POJ - 3723 】Conscription(最小生成树)

    Conscription Descriptions 需要征募女兵N人,男兵M人. 每招募一个人需要花费10000美元. 如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱. 给出若干男女之前的1 ...

  2. POJ3723最小生成树

    题意:从一个起点出发连接男孩子和女孩子,若是两者之间有连接的,则花费为10000-d,若是没有连接的则花费为10000 分析:很显然是一个最小生成树,但是我们希望的是d越大越好,因为d越大,10000 ...

  3. Conscription poj3723(最大生成树)

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6870   Accepted: 2361 Desc ...

  4. POJ 3723 Conscription【最小生成树】

    题意: 征用一些男生和女生,每个应都要给10000元,但是如果某个男生和女生之间有关系,则给的钱数为10000减去相应的亲密度,征集一个士兵时一次关系只能使用一次. 分析: kruskal求最小生成树 ...

  5. POJ-3723 Conscription---最大权森林---最小生成树

    题目链接: https://vjudge.net/problem/POJ-3723 题目大意: 需要征募女兵N人, 男兵M人. 每征募一个人需要花费10000美元. 带式如果已经征募的人中有一些关系亲 ...

  6. 《挑战程序设计竞赛》2.5 最小生成树 POJ3723 3169 1258 2377 2395 AOJ2224(1)

    POJ3723 http://poj.org/problem?id=3723 题意 windy要组建一支军队,召集了N个女孩和M个男孩,每个人要付10000RMB,但是如果一个女孩和一个男孩有关系d的 ...

  7. POJ 3723 Conscription (Kruskal并查集求最小生成树)

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14661   Accepted: 5102 Des ...

  8. POJ3723 Conscription 【并检查集合】

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8071   Accepted: 2810 Desc ...

  9. POJ 3723 Conscription 最小生成树

    题目链接: 题目 Conscription Time Limit: 1000MS Memory Limit: 65536K 问题描述 Windy has a country, and he wants ...

随机推荐

  1. CA认证的原理和流程及https原理

    1.什么是CA证书. 看过一些博客,写的比较形象具体. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常 ...

  2. elasticsearch-HQ 安装与使用

    https://github.com/ElasticHQ/elasticsearch-HQ Download or clone the repository. Open terminal and po ...

  3. Redis都有哪些数据类型

    string 这是最基本的类型了,就是普通的set和get,做简单的kv缓存 hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存 ...

  4. 17/11/24 05:08:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    2017-11-24 21:20:25 1:什么叫失望,什么叫绝望.总之是一脸懵逼的继续...... 之前部署的hadoop都是hadoop-2.4.1.tar.gz,这几天换成了hadoop-2.6 ...

  5. 用jQuery实现Ajax

    前置知识:ajax原理,json字符串进行信息传递. Ajax主要的功能是实现了浏览器端 异步 访问服务器:通过浏览器的XMLHttpRequest对象发出小部分数据,与服务端进行交互, 服务端返回小 ...

  6. update + join 多表操作

    UPDATE vtiger_notificationcf as a INNER JOIN vtiger_crmentity as b ON a.notificationid = b.crmid SET ...

  7. 【BZOJ2560】串珠子

    题解: 跟n个点有标号的无向连通图个数几乎一模一样 直接上代码了 代码: #include <bits/stdc++.h> using namespace std; #define ll ...

  8. IIS:另一个程序正在使用此文件进程无法访问。

    启动网站时,遇到这个错误,一般是端口已经被占用,更换一个空闲端口即可. 通过以下命令可查询 根据最后一列的数字在任务管理器中可查看被哪个程序占用了

  9. ng2tree在ios中无法触发click

    问题描述: 从其他页面跳转回ng2tree的页面时,无法触发节点的click事件 解决方案: 1. 在node_modules中搜索onNodeSeclected方法,修改click为touchend ...

  10. 033 Url中特殊字符的处理

    在url跳转页面的时候,参数值中的#不见了,一直没有处理,今天有空看了一下,后来发现后台的过滤器之类的都没有处理,就比较奇怪了,原来是特殊字符的问题. 一:Url中的特殊字符 1.说明 这里还是需要做 ...