poj3723_Conscription
Conscription
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. 1 ≤ N, M ≤ 10000 Output For each test case output the answer in a single line.
Sample Input 2 5 5 8 Sample Output 71071 Source POJ Monthly Contest – 2009.04.05, windy7926778
|
[Submit] [Go Back] [Status] [Discuss]
刚开始差点理解错意思,原来是男女两种人,windy必须要买掉所有人是(N+M)*10000,然后每两个人认识会给windy减少d的花费,kruskal中按照从大到小排序即可。
另外也可以把-d存进去,那样kruskal中就不用修改了。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define for(i,x,n) for(int i=x;i<n;i++)
#define ll long long int
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define MAX_N 50005 using namespace std; struct edge{int u,v,cost;};
edge es[MAX_N];
int V,E; int par[MAX_N];
int depth[MAX_N];//记录每个节点下面到位深度 void init(int n)//初始化
{for(i,,n) {par[i]=i;depth[i]=;}}
int findf(int t)//寻找根节点
{ return t==par[t] ? t:par[t]=findf(par[t]);}
bool same(int x,int y)//是否在同一组内
{return findf(x)==findf(y);}
void unite(int t1,int t2){//成为一组
int f1=findf(t1);
int f2=findf(t2);
if(f1==f2){
return ;
}
if(depth[f1]<depth[f2]){
par[f1]=f2;
}else{
par[f2]=f1;
if(depth[f1]==depth[f2]){
depth[f1]++;//记录深度
}
}
} bool comp(edge a,edge b){
return a.cost>b.cost;
} int kruskal(){
sort(es,es+E,comp);
init(V);
int res=;
for(i,,E){
edge e=es[i];
if(!same(e.u,e.v)){
unite(e.u,e.v);
res+=e.cost;
}
}
return res;
} int main()
{
//freopen("data.txt", "r", stdin);
//freopen("data.out", "w", stdout);
int N,M,R;
int x,y,d;
int n;
scanf("%d",&n);
while(n--){
scanf("%d %d %d",&N,&M,&R);
V=N+M;
E=R;
for(i,,R){
scanf("%d %d %d",&x,&y,&d);
es[i].u=x;
es[i].v=y+N;
es[i].cost=d;
}
int res=kruskal();
printf("%d\n",(N+M)*-res); }
//fclose(stdin);
//fclose(stdout);
return ;
}
poj3723_Conscription的更多相关文章
随机推荐
- Docker技术快速精通指南
doctor专业网站:http://www.dockerinfo.net/ Docker中文文档 csdn 的docker专栏: Docker技术快速精通指南
- 对Unity的Resources目录进行改名
项目用的是Unity5.5版本,开发的时候将相关的图集.预制对象资源都放在 Resources 目录下,而真机使用的是 StreamingAssets 目录下的资源. Resources(不分层级)在 ...
- 基于Cesium的demo赏析
更新于2019.2.23 Cesium的强大不用多说,所以有很多政府.组织基于cesium做了一些应用,其中不乏有很多优秀的示例,我们大都可以从中获得对自己的项目有益的东西.另:有的网站需要FQ. 官 ...
- C++ delegate的几种方法
https://stackoverflow.com/questions/9568150/what-is-a-c-delegate You have an incredible number of ch ...
- idea 集成sonarLint检查代码bugs
1.目标 idea集成sonar的代码检查,实现可以在提交代码前就检查你的代码,而不是将代码提交之后,之后再去检查. Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量 ...
- python接口自动化测试(二)-requests.get()
环境搭建好后,接下来我们先来了解一下requests的一些简单使用,主要包括: requests常用请求方法使用,包括:get,post requests库中的Session.Cookie的使用 其它 ...
- 【Linux】磁盘读写 测试
一.如何查看当前磁盘的IO使用情况 使用命令:iotop Total DISK READ: 3.89 K/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DI ...
- AYUI7 WPF MVC插件欣赏
AYUI7 MVC 提前预览 一个插件安装,享受所有快捷操作 静态图: 支持xaml中aymvc快速绑定多个操作 支持controller中 ayaction快速创建action代码块, 在AYU ...
- Mosquitto --topic
订阅树的概念 Mosquitto通过订阅树的方式来管理所有的topic以及客户端的订阅关系,它首先将所有的topic按照/分割并组织成一棵树结构,从根节点到树中的每个节点即组成该节点所对 ...
- SNF软件开发机器人教程更新
SNF开发机器人教程:链接:https://pan.baidu.com/s/1Qpomg11c_1b1NKY5P7e4Bw 密码:jwc3