Conscription(POJ 3723)
- 原题如下:
Conscription
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16584 Accepted: 5764 Description
Windy has a country, and he wants to build an army to protect his country. He has picked up N girls and M boys and wants to collect them to be his soldiers. To collect a soldier without any privilege, he must pay 10000 RMB. There are some relationships between girls and boys and Windy can use these relationships to reduce his cost. If girl x and boy y have a relationship d and one of them has been collected, Windy can collect the other one with 10000-d RMB. Now given all the relationships between girls and boys, your assignment is to find the least amount of money Windy has to pay. Notice that only one relationship can be used when collecting one soldier.
Input
The first line of input is the number of test case.
The first line of each test case contains three integers, N, M and R.
Then R lines followed, each contains three integers xi, yi and di.
There is a blank line before each test case.1 ≤ N, M ≤ 10000
0 ≤ R ≤ 50,000
0 ≤ xi < N
0 ≤ yi < M
0 < di < 10000Output
For each test case output the answer in a single line.Sample Input
2 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 3133Sample Output
71071
54223 - 题解:设想这样一个无向图:在征募某个人a时,如果使用了a和b之间的关系,那么就连一条a到b的边,假设这个图中存在圈,那么无论以什么顺序征募这个圈上的所有人,都会产生矛盾,即由于圈的存在,矛盾是必然的,由此可以知道,这个图应该是一片森林。反过来,给定一片森林里,必然可以使用对应的关系确定征募的顺序。综上,把人看作点,关系看作边,这个问题就可以转化为求解无向图中的最大权森林问题,最大权森林问题可以通过把所有边权取反后用最小生成树的算法求解
- 代码:
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cctype>
#define num s-'0' using namespace std; struct edge
{
int u;
int v;
int cost;
}; const int MAX_V=;
const int MAX_E=;
const int INF=0x3f3f3f3f;
int K,N, M, E, V;
edge es[MAX_E];
long long res;
int par[MAX_V];
int r[MAX_V]; void kruskal();
void init();
int find(int);
void unite(int, int);
bool same(int, int); void read(int &x){
char s;
x=;
bool flag=;
while(!isdigit(s=getchar()))
(s=='-')&&(flag=true);
for(x=num;isdigit(s=getchar());x=x*+num);
(flag)&&(x=-x);
} void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>)
write(x/);
putchar(x%+'');
} bool compare(const edge &e1, const edge &e2)
{
return e1.cost<e2.cost;
} int main()
{
read(K);
for (int j=; j<K; j++)
{
res=;
read(N);read(M);read(E);V=N+M;
for (int i=; i<E; i++)
{
read(es[i].u);read(es[i].v);read(es[i].cost);
es[i].v+=N;es[i].cost=-es[i].cost;
}
kruskal();
write(*(N+M)+res);
putchar('\n');
}
} void init()
{
for (int i=; i<V; i++)
{
par[i]=i;
r[i]=;
}
} int find(int x)
{
if (par[x]==x) return x;
return par[x]=find(par[x]);
} void unite(int x, int y)
{
x=find(x);
y=find(y);
if (x==y) return;
if (r[x]<r[y]) par[x]=y;
else
{
par[y]=x;
if (r[x]==r[y]) r[x]++;
}
} bool same(int x, int y)
{
return (find(x)==find(y));
} void kruskal()
{
sort(es, es+E, compare);
init();
for (int i=; i<E; i++)
{
edge e=es[i];
if (!same(e.u, e.v))
{
unite(e.u, e.v);
res+=e.cost;
}
}
}
Conscription(POJ 3723)的更多相关文章
- MST:Conscription(POJ 3723)
男女搭配,干活不累 题目大意:需要招募女兵和男兵,每一个人都的需要花费1W元的招募费用,但是如果有一些人之间有亲密的关系,那么就会减少一定的价钱,如果给出1~9999的人之间的亲密关系,现在要你求 ...
- Day5 - D - Conscription POJ - 3723
Windy has a country, and he wants to build an army to protect his country. He has picked up N girls ...
- poj - 3723 Conscription(最大权森林)
http://poj.org/problem?id=3723 windy需要挑选N各女孩,和M各男孩作为士兵,但是雇佣每个人都需要支付10000元的费用,如果男孩x和女孩y存在亲密度为d的关系,只要他 ...
- POJ 3723 Conscription(并查集建模)
[题目链接] http://poj.org/problem?id=3723 [题目大意] 招募名单上有n个男生和m个女生,招募价格均为10000, 但是某些男女之间存在好感,则招募的时候, 可以降低与 ...
- POJ 3723 Conscription MST
http://poj.org/problem?id=3723 题目大意: 需要征募女兵N人,男兵M人,没征募一个人需要花费10000美元,但是如果已经征募的人中有一些关系亲密的人,那么可以少花一些钱, ...
- POJ 3723 Conscription 最小生成树
题目链接: 题目 Conscription Time Limit: 1000MS Memory Limit: 65536K 问题描述 Windy has a country, and he wants ...
- POJ 3723 Conscription
Conscription Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6325 Accepted: 2184 Desc ...
- POJ 3723 Conscription (Kruskal并查集求最小生成树)
Conscription Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14661 Accepted: 5102 Des ...
- 【POJ - 3723 】Conscription(最小生成树)
Conscription Descriptions 需要征募女兵N人,男兵M人. 每招募一个人需要花费10000美元. 如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱. 给出若干男女之前的1 ...
随机推荐
- C#LeetCode刷题之#350-两个数组的交集 II(Intersection of Two Arrays II)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4044 访问. 给定两个数组,编写一个函数来计算它们的交集. 输入 ...
- centos环境 使用kubeadm快速安装k8s集群v1.16.2
全程使用root用户运行,宿主机需要连接外网 浏览一下官方kubeadm[有些镜像用不了] https://kubernetes.io/docs/setup/production-environmen ...
- cocos2dx重新设置 SDK NDK目录
参考博客https://blog.csdn.net/yinhe888675/article/details/41042347 初始设置SDK,NDK目录后,当我想换目录的时候不知道该怎么办,怎么重新设 ...
- java.util.Scanner中hasNext()方法和next()方法的区别
先说结论: 两者均根据空格划分数据 两者在没有数据输入时均会等待输入 next()方法会将空格划分的数据依次输出,运行一次,输出一个 hasNext()方法会跟着next()方法移动,当前数据不为空, ...
- JMeter软件测试工具介绍及基本安装教程
一.工具介绍 (一)简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试 ...
- HBA卡常用命令
HBA卡信息查看 查看对应的PCI设备lspci | grep LSI 如下:对应的HBA卡命令为sas3ircu 如下:对应的HBA卡使用sas2ircu 查看LSI控制器类型和型号 sas2irc ...
- 封装react antd的upload上传组件
上传文件也是我们在实际开发中常遇到的功能,比如上传产品图片以供更好地宣传我们的产品,上传excel文档以便于更好地展示更多的产品信息,上传zip文件以便于更好地收集一些资料信息等等.至于为何要把上传组 ...
- 【ZJOI2007】棋盘制作 - 悬线法
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个 \(8 \times 8\) 大小的黑白相间的方阵,对应八八六十四卦 ...
- Java继承后访问成员的特点
继承后的特点--成员变量 对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编 ...
- JAVA 读取excel文件成List<Entity>
package com.fsinfo.common.utils; import com.fsinfo.modules.enterprise.entity.EnterpriseRecordEntity; ...