题目描述 Description

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极

不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨

气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之

间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并

造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,

然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,

如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在

两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只

要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那

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

输入描述 Input Description

第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。

接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证且每对罪犯组合只出现一次。

输出描述 Output Description

共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱

中未发生任何冲突事件,请输出0。

样例输入 Sample Input

4 6

1 4 2534

2 3 3512

1 2 28351

1 3 6618

2 4 1805

3 4 12884

样例输出 Sample Output

3512

这道题做了好几遍了,一直是用并查集写的,今天突然听说可以用二分+染色做,一想还真是,然后就写了一遍,时间也差不多,直接上代码吧。

首先是并查集做法。

  1. /*
  2. 首先将罪犯之间的关系按照怒气的大小从小到大排序,针对每一个罪犯,
  3. 设立一个他的集合和补集,集合中存放着他们在同一监狱,
  4. 补集中存放着他们在不同监狱。
  5. */
  6. #include<cstdio>
  7. #include<iostream>
  8. #include<cstring>
  9. #include<algorithm>
  10. #define N 20010
  11. #define M 100010
  12. using namespace std;
  13. int fa[M],n,m;
  14. struct node
  15. {
  16. int a,b,w;
  17. };node v[M];
  18. int cmp(const node&x,const node&y)
  19. {
  20. return x.w>y.w;
  21. }
  22. int find(int x)
  23. {
  24. if(fa[x]==x)return fa[x];
  25. else return fa[x]=find(fa[x]);
  26. }
  27. void init()
  28. {
  29. scanf("%d%d",&n,&m);
  30. for(int i=;i<=m;i++)
  31. scanf("%d%d%d",&v[i].a,&v[i].b,&v[i].w);
  32. sort(v+,v+m+,cmp);
  33. for(int i=;i<=*n;i++)
  34. fa[i]=i;
  35. for(int i=;i<=m;i++)
  36. {
  37. int x=find(v[i].a),y=find(v[i].b);
  38. if(x==y)//两人在同一监狱
  39. {
  40. printf("%d\n",v[i].w);
  41. return;
  42. }
  43. int xx=find(v[i].a+n);//罪犯x的补集
  44. int yy=find(v[i].b+n);//罪犯y的补集
  45. //想将x与y关到不同的监狱,那么x的补集与y在同一监狱,y的补集与x在同一监狱
  46. fa[xx]=y;
  47. fa[yy]=x;
  48. }
  49. printf("");
  50. }
  51. int main()
  52. {
  53. init();
  54. return ;
  55. }

二分+染色

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #define N 20010
  5. #define M 100010
  6. using namespace std;
  7. int head[N],vis[N],n,m;bool flag;
  8. struct node
  9. {
  10. int v,pre,t;
  11. };node e[M*];
  12. int read()
  13. {
  14. char c=getchar();int num=,flag=;
  15. while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
  16. while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
  17. return num*flag;
  18. }
  19. void add(int i,int x,int y,int z)
  20. {
  21. e[i].v=y;
  22. e[i].t=z;
  23. e[i].pre=head[x];
  24. head[x]=i;
  25. }
  26. void dfs(int now,int from,int limit)
  27. {
  28. if(flag)return;
  29. for(int i=head[now];i;i=e[i].pre)
  30. if(e[i].t>limit&&e[i].v!=from)
  31. {
  32. if(!vis[e[i].v])
  33. {
  34. vis[e[i].v]=-vis[now];
  35. dfs(e[i].v,now,limit);
  36. }
  37. else if(vis[e[i].v]==vis[now])
  38. {
  39. flag=true;
  40. return;
  41. }
  42. }
  43. }
  44. bool check(int x)
  45. {
  46. memset(vis,,sizeof(vis));
  47. flag=false;
  48. for(int i=;i<=n;i++)
  49. if(!vis[i])
  50. {
  51. vis[i]=;
  52. dfs(i,i,x);
  53. }
  54. if(flag)return false;
  55. return true;
  56. }
  57. int main()
  58. {
  59. int ll=,rr=;
  60. n=read();m=read();
  61. for(int i=;i<=m;i++)
  62. {
  63. int x=read(),y=read(),z=read();
  64. add(i*-,x,y,z);add(i*,y,x,z);
  65. rr=max(rr,z);
  66. }
  67. while(ll<=rr)
  68. {
  69. int mid=(ll+rr)/;
  70. if(check(mid))rr=mid-;
  71. else ll=mid+;
  72. }
  73. printf("%d",ll);
  74. return ;
  75. }

关押罪犯(codevs 1069)的更多相关文章

  1. 洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

    P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误 ...

  2. codevs 1069 关押罪犯

    提交地址:http://codevs.cn/problem/1069/ 1069 关押罪犯 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻 ...

  3. 并查集补集作法 codevs 1069 关押罪犯

    1069 关押罪犯 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description ...

  4. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  5. NOIP2010提高组] CODEVS 1069 关押罪犯(并查集)

    这道这么简单的题目还写了这么久.. 将每个会发生冲突的两人的怒气进行排序,然后从怒气大到小,将两个人放到不同监狱中.假如两人都已经被放置且在同一监狱,这就是答案. ------------------ ...

  6. NOIP2010提高组 关押罪犯 -SilverN

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

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

    刚才做并查集想到了这道以前做的题,干脆一并放上来 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可 ...

  8. Luogu P1892 P1525 团伙 关押罪犯

    (怎么都是抓罪犯 怪不得写法差不多) 团伙 关押罪犯 并查集.以"敌人的敌人是朋友"的思路来处理.所以增加一个e/E数组来存储敌人. 关押罪犯还用到了贪心的思路.将冲突值从大到小排 ...

  9. 洛谷 P1525 关押罪犯

    题目链接 https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1−N.他们之间的关系自然也极不和谐.很多罪 ...

  10. Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)

    Luogu 1525 [NOIP2010]关押罪犯 (贪心,并查集) Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨 ...

随机推荐

  1. Openjudge 8782 乘积最大

    伤心,感冒了根本没精力肝题,只能做点小的 描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力 ...

  2. Web开发中错误页面的配置

    一.创建错误处理页. 1)web.xml里面添加 <error-page> <error-code>404</error-code> <location> ...

  3. IOS基础之 (十五)知识点

    一 SEL 1. 方法的存储位置 每个类的方法地址列表都存储在类对象中. 每个方法都有一个与之对应的SEL类型的对象. 根据一个SEL对象就可以找到方法的地址,进而调用方法. Person.h #im ...

  4. 面向对象之集合ArrayList

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  5. Fast-cgi cgi nginx php-fpm 的关系 (转

    Fast-cgi  cgi  nginx  PHP-fpm 的关系 Fast-cgi是由cgi发展而来,是http服务器(http,nginx等)和动态脚本语言(php,perl等)之间的的通信接口, ...

  6. Java web小记

    1.Java Web设置页面刷新的方法(两种): response.setHeader("refresh", "0.3," + request.getHeade ...

  7. PHP iconv函数字符串转码导致截断问题

    1.iconv函数原型 string iconv ( string $in_charset , string $out_charset , string $str ) in_charset:输入的字符 ...

  8. php 非缓冲查询

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  9. 每日构建【Daily Build Using CruiseControl.NET and MSBuild】(转载)

    在上一篇项目 管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中 我们已经讲解了如何使用TortoiseSVN和 ...

  10. Jni中C++和Java的参数传递 参数对照

    Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用V ...