Conscription
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 12393   Accepted: 4350

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, NM and R.
Then R lines followed, each contains three integers xiyi and di.
There is a blank line before each test case.

1 ≤ NM ≤ 10000
0 ≤ R ≤ 50,000
0 ≤ xi < N
0 ≤ yi < M
0 < di < 10000

Output

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 3133

Sample Output

71071
54223

Source

[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的更多相关文章

随机推荐

  1. CentOS下安装Jenkins(Docker/war/tomcat/java -jar)

    参考官方提供的安装教程:https://jenkins.io/doc/book/installing/,可以发现官方推荐使用Docker进行安装.虽然用Docker有很多好处,但也有缺点. 下面是各种 ...

  2. 邮轮ERP系统

    近两年一直做邮轮旅游方面的系统开发,最近有点时间,就花了两三个月,开发了一套邮轮ERP. 感兴趣的同学可以给我留言(904308112@qq.com),一起交流学习.

  3. Java全栈程序员之08:MAVEN+JAVA配置

    从Spring3.0开始,Spring支持以Java配置的方式来代替XML配置.这一点说起来其实有点可笑,XML配置的方式最初被创建出来就是为了让配置与程序员无关.可是最终我们发现,绝大多数的那些配置 ...

  4. 如何确定Isilon cluster的网卡类型是40GbE的还是10GbE的

    可以使用isi upgrade cluster firmware devices命令. 从命令行输出可以看到,当前的cluster使用的是40G的前端网卡. 如果是10G网卡,输出结果应当是如下的样子 ...

  5. idea插件actiBPM源码

    actiBPM https://github.com/Activiti/Activiti

  6. google map 路线服务

    入门指南 使用 Google Maps JavaScript API 中的路线服务之前,首先要确保在为 Google Maps JavaScript API 设置的同一项目的 Google API C ...

  7. Win10系统的SurfacePro4如何重装系统-2 重装WIN10系统

    把SurfacePro充好电,然后关机,开机按住音量+,然后再按电源键,可以开机并进入BIOS(此前应确保优盘已经装了PE并插入Surface)   然后选择U盘启动为第一个(按住之后把他拖放到第一位 ...

  8. 每天一个linux命令(9):touch

    1.命令简介 touch命令将每个文件的访问时间和修改时间改为当前时间. 2.用法 touch [选项]... 文件... 3.选项 -a 只更改访问时间 -c, --no-create 不创建任何文 ...

  9. Google Guava Stopwatch(计时器)

    Stopwatch stopwatch =newStopwatch().start(); //do something test for(int i =0; i <10000; i++){ } ...

  10. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...