【codevs1069】关押罪犯[noip2010](并查集)
S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极
不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨
气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之
间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并
造成影响力为c 的冲突事件。
每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,
然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,
如果影响很坏,他就会考虑撤换警察局长。
在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在
两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只
要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那
么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是少?
第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。
接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证,且每对罪犯组合只出现一次。
共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱
中未发生任何冲突事件,请输出0。
4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
3512
罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件
影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。
【数据范围】
对于30%的数据有N≤ 15。
对于70%的数据有N≤ 2000,M≤ 50000。
对于100%的数据有N≤ 20000,M≤ 100000。
————————————————————————————————————————我是奇妙的分割线——————————————————————————————————
看到这道题蒟蒻我的第一个想法就是贪心,因为题目要求使最大的怨气值最小,所以只要把怨气值排序,再尽量满足有怨气的罪犯不分到同一个监狱,直到一定会起冲突。但是直接枚举判断监狱里是否有这个罪犯的敌人非常麻烦,需要枚举每一个在这个监狱里的罪犯,判断是否有冲突,肯定会TLE。于是,蒟蒻想到了刚学的并查集。
科普部分:想学并查集的请浏览http://blog.csdn.net/dellaserss/article/details/7724401/(某大神的并查集详解(转))
于是使用并查集,但还需要一个神奇的技巧:
我们只需要记录每个罪犯最近一次枚举到的敌人,在第二次枚举到这个罪犯时,将他的敌人和上一次枚举到的敌人合并(即放到同一个监狱),这样一个罪犯的所有敌人都会被合并(放到同一个监狱),这样当两个互为敌人的罪犯出现在同一个监狱时,就知道会起冲突。
最后,再梳理一下解题流程:
1、对怨气值排序;
2、按怨气值从大到小枚举每对罪犯,再用并查集处理;
3、没有起冲突的罪犯时不要忘了输出0;
———————————————————————————————————————我是奇妙的分割线x2—————————————————————————————————
当AC时我特别开心(一个蒟蒻做出水题的开心),看题解发现有大神用二分图(orz orz orz orz orz orz orz orz orz orz orz 我不会)
代码如下:
var e,x,y:array[..]of longint;
f,a:array[..]of longint;
n,m,i:longint;
procedure qs(l,r:longint);
var i,j,m,t:longint;
begin
i:=l; j:=r; m:=e[(l+r)shr ];
repeat
while e[i]>m do inc(i);
while e[j]<m do dec(j);
if i<=j then begin
t:=e[i]; e[i]:=e[j]; e[j]:=t;
t:=x[i]; x[i]:=x[j]; x[j]:=t;
t:=y[i]; y[i]:=y[j]; y[j]:=t;
inc(i); dec(j);
end;
until i>j;
if l<j then qs(l,j);
if i<r then qs(i,r);
end;
function find(n:longint):longint;
begin
if f[n]=n then exit(n);
find:=find(f[n]);
f[n]:=find;
end;
procedure merge(a,b:longint);
var x,y:longint;
begin
x:=find(a); y:=find(b);
if x<>y then f[x]:=y;
end;
begin
readln(n,m);
for i:= to m do
read(x[i],y[i],e[i]);
qs(,m);
for i:= to n do
f[i]:=i;
for i:= to m do begin
if find(x[i])=find(y[i])then begin
writeln(e[i]);
halt;
end;
if a[x[i]]<> then merge(a[x[i]],y[i]);
if a[y[i]]<> then merge(x[i],a[y[i]]);
a[x[i]]:=y[i]; a[y[i]]:=x[i];
end;
writeln();
end.
【codevs1069】关押罪犯[noip2010](并查集)的更多相关文章
- codevs1069关押罪犯(并查集)
题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 ...
- 洛谷1525 关押罪犯NOIP2010 并查集
问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...
- P1525 关押罪犯[扩展域并查集]
题目来源:洛谷 题目描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1−N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整 ...
- 洛谷P1525 关押罪犯(并查集、二分图判定)
本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...
- NOIP2010 关押罪犯 (并查集)
若x,y有关系 将x与y的补集, y与x的补集建立关系 ; maxm=; ..maxm,..] of longint; f:..maxn*] of longint; i,j,m,n,x,y,z:lon ...
- AcWing 257. 关押罪犯 (并查集)打卡
题目:https://www.acwing.com/problem/content/description/259/ 题意:有两个监狱,监狱里面有很多犯人,现在有很多对冲突,还有个冲突值,现在问我们怎 ...
- 洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)
传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案. 怎样判断是否在一个监狱中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...
- 洛谷 P1525 关押罪犯 NOIp2010提高组 (贪心+并查集)
题目链接:https://www.luogu.org/problemnew/show/P1525 题目分析 通过分析,我们可以知道,这道题的抽象意义就是把一个带边权的无向图,分成两个点集,使得两个集合 ...
- luoguP1525 关押罪犯 题解(NOIP2010)(并查集反集)
P1525 关押罪犯 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...
随机推荐
- Android无线测试之—UiAutomator UiSelector API介绍之六
对象搜索—类名与包名 一.类名属性定位对象 返回值 API 描述 UiSelector calssName(String className) 完整类名匹配 UiSelector calssNameM ...
- 项目中lua(基础)
关于项目中lua任务(某些没弄懂,但lua上耗费时间有点长了不看了) 这段时间看了lua语法和项目中lua应用 .在lua中注册c库,在lua5.2中好像都是注册c库,相当于在lua中定义一个tabl ...
- IIS配置(持续更新中...)
本文暂时适用于IIS7.5. IIS配置文件路径:"C:\Windows\System32\inetsrv\config\applicationHost.config" 1.sta ...
- ubuntu1.4搭建zookeeper3.5.2分布式集群
1.下载 官网链接:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.5.2-alpha/zookeeper-3.5.2-alpha.ta ...
- Introduction to Mathematical Thinking - Week 9 评论答案2
根据 rubic 打分. 1. 我认为,如果说明 m, n 是自然数,所以最小值是 1 会更清楚.所以 Clarity 我给了 3 分.其他都是 4 分,所以一共是 23 分. 2. 我给出的分数 ...
- /cloudmonitor.log 主机监控
989866842 INFO 2018-09-30 01:38:58.58 [ricGatherServiceHttp] 提交指标完成,耗时:18ms. SystemInfo [serialNumbe ...
- Centos7安装zookeeper
1.进入/opt cd /opt 2.下载 zookeeper-3.4.10.tar.gz: wget https://mirrors.tuna.tsinghua.edu.cn/apache/zook ...
- 利用Hibernate注解生成表
转自:http://blog.csdn.net/madison__/article/details/55677099 Hibernate4注释 @Entity(name = "tbl_use ...
- unity坑faq
遇到的坑记录下来,大都都是听说,没有实测 1. Graphics.copyTexture,在某些机型上不支持从不同类型拷贝 2. msaa 小米mix2不支持,晓龙845 3. android4.2下 ...
- 通过配置rinetd来实现ECS跳转访问非外网连接的mongodb
跳转的原理通用,不单单针对mongo,其他需求应用也可以使用这种方式 生成环境中的mongodb迁移到了阿里云上的mongodb,由于机制的问题,mongodb不能直接被外网访问,故此采用的办法为 ...