二分+2-SAT

先预处理出所有的v,然后离散化一下,在那个的基础上二分,对于每次二分出的值约束边权超过所二分出的边权的两点。

  1. //OJ 1322
  2. //by Cydiater
  3. //2015.8.26
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <queue>
  8. #include <map>
  9. #include <ctime>
  10. #include <string>
  11. #include <algorithm>
  12. #include <iomanip>
  13. #include <cstdlib>
  14. #include <cmath>
  15. using namespace std;
  16. #define ll long long
  17. #define up(i,j,n) for(int i=j;i<=n;i++)
  18. #define down(i,j,n) for(int i=j;i>=n;i--)
  19. ;
  20. const int oo=0x3f3f3f3f;
  21. inline int read(){
  22. ,f=;
  23. ;ch=getchar();}
  24. +ch-';ch=getchar();}
  25. return x*f;
  26. }
  27. map<int,int>m;
  28. ,cnt=,num[MAXN],leftt,rightt,len=,group[MAXN],group_num,dfn[MAXN],low[MAXN],stack[MAXN],node[MAXN][],part=,dfs_clock=;
  29. bool vis[MAXN];
  30. struct edge{
  31. int y,next,x;
  32. }e[MAXN];
  33. struct Prison{
  34. int x,y,v;
  35. }a[MAXN];
  36. namespace solution{
  37. inline void insert(int x,int y){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].x=x;}
  38. void init(){
  39. N=read();M=read();
  40. tmp[++top]=;
  41. up(i,,M){
  42. a[i].x=read();a[i].y=read();a[i].v=read();
  43. tmp[++top]=a[i].v;
  44. }
  45. sort(tmp+,tmp+top+);
  46. up(i,,top)if(!m[tmp[i]]){
  47. m[tmp[i]]=++cnt;
  48. num[cnt]=tmp[i];
  49. }
  50. up(i,,N)up(j,,)node[i][j]=++part;
  51. }
  52. void tarjan(int node){
  53. dfn[node]=low[node]=++dfs_clock;
  54. vis[node]=;stack[++top]=node;
  55. for(int i=LINK[node];i;i=e[i].next)
  56. if(!dfn[e[i].y]){
  57. tarjan(e[i].y);
  58. low[node]=min(low[node],low[e[i].y]);
  59. }else if(vis[e[i].y]) low[node]=min(low[node],dfn[e[i].y]);
  60. if(low[node]==dfn[node]){
  61. int tmp;group_num++;
  62. do{
  63. tmp=stack[top--];
  64. vis[tmp]=;
  65. group[tmp]=group_num;
  66. }while(tmp!=node);
  67. }
  68. }
  69. bool check(int xx){
  70. len=;top=;dfs_clock=;group_num=;
  71. memset(LINK,,sizeof(LINK));
  72. memset(dfn,,sizeof(dfn));
  73. memset(vis,,sizeof(vis));
  74. up(i,,M)if(a[i].v>xx){
  75. int x=a[i].x,y=a[i].y;
  76. //cout<<x<<' '<<y<<endl;
  77. insert(node[x][],node[y][]);
  78. insert(node[y][],node[x][]);
  79. insert(node[x][],node[y][]);
  80. insert(node[y][],node[x][]);
  81. }
  82. up(i,,N<<)if(!dfn[i])tarjan(i);
  83. up(i,,N)]]==group[node[i][]]);
  84. ;
  85. }
  86. void slove(){
  87. leftt=;rightt=cnt;
  88. <rightt){
  89. ;
  90. if(check(num[mid])) rightt=mid;
  91. else leftt=mid;
  92. }
  93. }
  94. void output(){
  95. if(check(num[leftt])){
  96. cout<<num[leftt]<<endl;
  97. }else
  98. cout<<num[rightt]<<endl;
  99. }
  100. }
  101. int main(){
  102. //freopen("input.in","r",stdin);
  103. using namespace solution;
  104. init();
  105. slove();
  106. output();
  107. ;
  108. }

NOIp2010 关押罪犯的更多相关文章

  1. 【洛谷P1525】[NOIP2010]关押罪犯

    关押罪犯 题目链接 思路: 二分图或并查集 这里讲并查集算法: 1.将每对罪犯的冲突关系按影响从大到小排序 2.将集合与(i+n)合并表示编号为i的罪犯不能在该集合内 3.依次从大到小处理冲突关系: ...

  2. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

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

  3. TYVJ P1403 [NOIP2010]关押罪犯

    TYVJ的编译器总是要搞点岔子出来,上次是double必须用f输出而不能用lf,这次又不知道为何CE 于是去了洛谷P1525测试,AC 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1 ...

  4. noip2010 关押罪犯 (vijos1776)

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

  5. NOIP2010关押罪犯

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

  6. NOIP2010 关押罪犯 (并查集)

    若x,y有关系 将x与y的补集, y与x的补集建立关系 ; maxm=; ..maxm,..] of longint; f:..maxn*] of longint; i,j,m,n,x,y,z:lon ...

  7. [noip2010]关押罪犯 并查集

    第一次看的时候想到了并查集,但是不知道怎么实现: 标解,f[i]表示i所属的集合,用f[i+n]表示i所属集合的补集,实现的很巧妙,可以当成一个使用并查集的巧妙应用: #include<iost ...

  8. NOIP2010关押罪犯 二分+二染色

    这个题一上来 没有思路,后来想没有思路就二分吧 那么我们来二分 首先,大于当前的mid值的关系,不能出现在一个集合里 (即关系形成的图是一个二分图,判定二分图可以二染色) 如果不能形成二分图,那么说明 ...

  9. tyvj P1403 关押罪犯 题解

    P1403 [NOIP2010]关押罪犯 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述    S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他 ...

随机推荐

  1. IIS安装与MVC程序部署

    最近在做访客系统,虽然说不是什么多大的项目,但麻雀虽小五脏俱全,使用EF Code First+Mysql+Frozenui响应式布局,感觉通过这个项目学到好多东西,Mysql的使用.EF映射Mysq ...

  2. DB2和Oracle区别

    转 http://blog.chinaunix.net/uid-7374279-id-2057574.html 写在前面:今天客户来访(日本人),问我DB2和Oracle区别.因为不是DBA(勉强的理 ...

  3. hihocoder1033交错和

    题目链接 坑: 1.ll x,y; z=x*y;可能会溢出,于是我写成x%mod*y%mod 仍旧错误,要写成x%mod*(y%mod). 2.f(9019)=1. 要注意如果为0,下一位的符号根据0 ...

  4. Android 轻量级输入校验库:Fire Eye

    Fire Eye是一款轻量级简单易用的Android校验库. FireEye 2.0 在 1.0 的基础上,全部重写了代码,并优化了架构,性能上和逻辑上都大大提升.只需要几行代码,即可验证用户输入,并 ...

  5. JS iframe元素和父页面元素互访

    说明:以下内容来自互联网 [1]子页面取得父页面的dom对象   parent.window.$('#id').val("");   [2]父页面取得子页面的对象   $(wind ...

  6. 毕向东JAVA基础25天教程目录

    视频目录:day01-01-基本常识day01-02-Java的跨平台性day01-03-Java环境搭建(安装)day01-04-Java环境搭建(环境变量配置)day01-05-Java环境搭建( ...

  7. extJs学习基础5 理解mvvm的一个小案例

    今天很是幸运,看到了一位大神的博客,学习了不少的东西.太感谢了.(满满的都是爱啊) 建议去学习这个大神的博客,真心不错. 博客地址:http://blog.csdn.net/column/detail ...

  8. Android Retrofit网络请求Service,@Path、@Query、@QueryMap、@FieldMap (转)

    GET请求 多个参数在URL问号之后,且个数不确定 http://api.stay4it.com/News?newsId=1&type=类型1- http://api.stay4it.com/ ...

  9. git组成结构

    1. blob对象(blob) 2. 目录树(tree) 3. 提交(commit) 4. 标签(tag) git 文件按照状态分为3类: 1. 已追踪的(tracked) 2. 被忽略的(Ignor ...

  10. Spring Assert 断言

    Assert(断言)的初步理解构思 Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查, ...