P1525 关押罪犯

题目描述

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。

那么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?

输入输出格式

输入格式:

输入文件的每行中两个数之间用一个空格隔开。第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证1<aj=<=bj<=N ,0 < cj≤ 1,000,000,000,且每对罪犯组合只出现一次。

输出格式:

共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。

输入输出样例

输入样例#1:

4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884

输出样例#1:

3512

说明

【输入输出样例说明】罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。

【数据范围】对于30%的数据有N≤ 15。对于70%的数据有N≤ 2000,M≤ 50000。对于100%的数据有N≤ 20000,M≤ 100000。

再经典不过的一道题

两种做法:

1.并查集

  对于每个点存两个集合,一个是和他同监狱的,一个是和他不同监狱的

  将怨恨值从大到小排,循环每个怨恨关系,要防止冲突的出现,就要使两人不在同一监狱中,并且与其中一个人不在同一监狱的人一定与另一个人在同一监狱

  如果查到怨恨关系对应的两个人已经在统一监狱中了,由于怨恨关系是从大到小排列的,所以这一定是最大的一个,直接输出

2.二分+染色

  题目要求最小化最大值,不难想到要用二分答案

  由于只有两个监狱存在,染色就只需要染两种,分别对应两个监狱中的人

  答案的最大可能值和最小可能值很显然,然后就是判断的问题了

  判断也不难,就是神搜与其有关系的人,只要怨恨值大于期望值,就把他俩放到不同监狱里,如果两人已经被安排到同一个监狱,则说明这个期望值是不可行的

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 20000*3
#define maxm 100000*3
int fa[maxn],n,m;
struct node{int from,to,v;}e[maxm];
int cmp(node a,node b){return a.v>b.v;}
int find(int x){if(fa[x]==x)return fa[x];else return fa[x]=find(fa[x]);
}
int main(){scanf("%d%d",&n,&m);int x,y,z;for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);e[i].from=x;e[i].to=y;e[i].v=z;}sort(e+1,e+m+1,cmp);for(int i=1;i<=n*2;i++)fa[i]=i;for(int i=1;i<=m;i++){int f1=find(e[i].from);int f2=find(e[i].to);if(f1==f2){printf("%d",e[i].v);return 0;}fa[f1]=find(e[i].to+n);fa[f2]=find(e[i].from+n);}printf("0");return 0;
}

并查集

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxm 100010
#define maxn 20010
int n,head[maxm*2],m,num,l,r,vis[maxn];
struct node{int to,pre,v;
}e[maxm*2];
bool flag;
void Insert(int from,int to,int v){e[++num].to=to;e[num].v=v;e[num].pre=head[from];head[from]=num;
}
void dfs(int fa,int now,int limit){if(flag)return;for(int i=head[now];i;i=e[i].pre){int to=e[i].to;if(e[i].v>limit&&to!=fa){if(!vis[to]){vis[to]=-vis[now];dfs(now,to,limit);}else if(vis[to]==vis[now]){flag=1;return;}}}
}
bool check(int x){memset(vis,0,sizeof(vis));flag=false;for(int i=1;i<=n;i++){if(!vis[i]){vis[i]=1;dfs(i,i,x);}}if(flag)return false;return true;
}
int main(){scanf("%d%d",&n,&m);int x,y,z;for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);r=max(r,z);Insert(x,y,z);Insert(y,x,z);}while(l<=r){int mid=(l+r)>>1;if(check(mid))r=mid-1;else l=mid+1;}printf("%d",l);
}

二分+染色

转载于:https://www.cnblogs.com/thmyl/p/7040361.html

洛谷P1525 关押罪犯相关推荐

  1. 并查集——关押罪犯(洛谷 P1525)

    题目选自洛谷P1525 此题是一道很经典,而且很好的题目.思路也十分的新颖,比较的难以捉摸. 题面大意:(人性翻译) 给你m对矛盾关系,每对关系分别涉及到x,y两人,矛盾值为w 请你判断分配x和y到两 ...

  2. NOIP2010关押罪犯题解(洛谷P1525) (并查集)

    NOIP2010关押罪犯题解(洛谷P1525) (并查集) 日常膜拜dalao:财神万岁!!!!!!!!!!!!!!!!!!!!! 日常凌晨三点水题解..(原谅我中间断更了几天,,马上分班考试了竞赛顾 ...

  3. P1525 关押罪犯(扩展域并查集/二分图)

    洛谷题目链接 输入 4 6 1 4 2534 2 3 3512 1 2 28351 1 3 6618 2 4 1805 3 4 12884 输出 3512 1.并查集 有意思的一道并查集的题,需要一些 ...

  4. 关押罪犯洛谷P1525

    题目+评测传送门 思路 其实这一题有2种不同的思路,但是由于我实在是太蒟蒻了,只会其中一种,另一种看了半天都不知道它在讲什么/(ㄒoㄒ)/~~ 首先,我们要学习一下二分图及其判断方法博客,然后这个题目 ...

  5. P1525 关押罪犯

    题目描述 SS 城现有两座监狱,一共关押着 NN 名罪犯,编号分别为 1-N1−N .他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气 ...

  6. P1525关押罪犯(并查集补集)

    问题传送门 问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1-N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值&qu ...

  7. [NOIP2010提高组]关押罪犯

    题目:洛谷P1525.Vijos P1776.codevs1069. 题目大意:有一些罪犯,两个罪犯之间可能会发生冲突,冲突有个影响力,而如果两个罪犯在不同监狱里,就可以避免冲突.现在有两个监狱,要你 ...

  8. 关押罪犯-并查集、贪心

    题目来源:Acwing 257.关押罪犯&洛谷 P1525 [NOIP2010 提高组] 关押罪犯 思路来源:这里 题目描述 S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为1~N. 他 ...

  9. #洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯

    洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯 #题目描述 #一看很明显是贪心算法 加排序 因为 这个中间最大值的那一对肯定是不会在一起的 从大到小来看 所有点对都尽量不要在一个监狱 # ...

最新文章

  1. 爱国者D5移动电源改造
  2. Android中如何使用ViewPager实现类似laucher左右拖动效果
  3. 今天写的上传类,纯练手之作,供新人学习
  4. maven项目打包时生成dependency-reduced-pom.xml
  5. AI YOLO目标检测算法
  6. 怎样把水货E72升级后英文变中文
  7. 【读书笔记《Android游戏编程之从零开始》】5.Android 游戏开发常用的系统控件(ProgressBar、Seekbar)
  8. python打开360浏览器_使用python3.7 的pycharm selenium自动化测试中启动360浏览器、360极速浏览器的方法...
  9. 【分布式】什么是分布式技术?
  10. 手机ncm转mp3工具_一款手机、电脑都能用的文字转语音工具,够高能! - 橘子世界...
  11. jquery导入数据_【Python成长之路】从 零做网站开发 -- 基于Flask和JQuery,实现表格管理平台...
  12. 通过Vue+flvjs在HTML5中播放flv格式视频文件—demo及api
  13. 工作表、工作簿保护密码关闭
  14. vue之ele组件中input表单限制输入字符
  15. 自然语言处理之hmm(隐马尔可夫模型)
  16. Cytoscape.js学习记录
  17. Done、Doing、ToDo
  18. 第一个被赋予公明身份的机器人_第一个获得公民身份的机器人,放话“毁灭人类”,下场如何?...
  19. Dicky - 开源中国社区
  20. 初学编程,从抄代码开始就够了吗?看看我的故事!

热门文章

  1. delphi中TStringGrid数据的导出
  2. 第7节 三个败家子(7)——收藏IQ也会贬值
  3. void Update ( ) 更新 void FixedUpdate ( )
  4. IOS CALayer的属性和使用
  5. 代码审计之DocCms漏洞分析
  6. win2008修改远程端口
  7. 实战:ajax带参数请求slim API
  8. linux/window 下 solr5.1 tomcat7.x 环境搭建即简单功能测试
  9. Shit和trash不是评价设计的词汇
  10. 我们应当学会辞旧迎新——《不一样的天空》