二分+2-SAT

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

 //OJ 1322
 //by Cydiater
 //2015.8.26
 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <queue>
 #include <map>
 #include <ctime>
 #include <string>
 #include <algorithm>
 #include <iomanip>
 #include <cstdlib>
 #include <cmath>
 using namespace std;
 #define ll long long
 #define up(i,j,n)       for(int i=j;i<=n;i++)
 #define down(i,j,n)     for(int i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline int read(){
       ,f=;
       ;ch=getchar();}
       +ch-';ch=getchar();}
       return x*f;
 }
 map<int,int>m;
 ,cnt=,num[MAXN],leftt,rightt,len=,group[MAXN],group_num,dfn[MAXN],low[MAXN],stack[MAXN],node[MAXN][],part=,dfs_clock=;
 bool vis[MAXN];
 struct edge{
       int y,next,x;
 }e[MAXN];
 struct Prison{
       int x,y,v;
 }a[MAXN];
 namespace solution{
       inline void insert(int x,int y){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].x=x;}
       void init(){
             N=read();M=read();
             tmp[++top]=;
             up(i,,M){
                   a[i].x=read();a[i].y=read();a[i].v=read();
                   tmp[++top]=a[i].v;
             }
             sort(tmp+,tmp+top+);
             up(i,,top)if(!m[tmp[i]]){
                   m[tmp[i]]=++cnt;
                   num[cnt]=tmp[i];
             }
             up(i,,N)up(j,,)node[i][j]=++part;
       }
       void tarjan(int node){
             dfn[node]=low[node]=++dfs_clock;
             vis[node]=;stack[++top]=node;
             for(int i=LINK[node];i;i=e[i].next)
                   if(!dfn[e[i].y]){
                         tarjan(e[i].y);
                         low[node]=min(low[node],low[e[i].y]);
                   }else if(vis[e[i].y]) low[node]=min(low[node],dfn[e[i].y]);
             if(low[node]==dfn[node]){
                   int tmp;group_num++;
                   do{
                         tmp=stack[top--];
                         vis[tmp]=;
                         group[tmp]=group_num;
                   }while(tmp!=node);
             }
       }
       bool check(int xx){
             len=;top=;dfs_clock=;group_num=;
             memset(LINK,,sizeof(LINK));
             memset(dfn,,sizeof(dfn));
             memset(vis,,sizeof(vis));
             up(i,,M)if(a[i].v>xx){
                   int x=a[i].x,y=a[i].y;
                   //cout<<x<<' '<<y<<endl;
                   insert(node[x][],node[y][]);
                   insert(node[y][],node[x][]);
                   insert(node[x][],node[y][]);
                   insert(node[y][],node[x][]);
             }
             up(i,,N<<)if(!dfn[i])tarjan(i);
             up(i,,N)]]==group[node[i][]]);
             ;
       }
       void slove(){
             leftt=;rightt=cnt;
             <rightt){
                   ;
                   if(check(num[mid]))     rightt=mid;
                   else                    leftt=mid;
             }
       }
       void output(){
             if(check(num[leftt])){
                   cout<<num[leftt]<<endl;
             }else
                   cout<<num[rightt]<<endl;
       }
 }
 int main(){
       //freopen("input.in","r",stdin);
       using namespace solution;
       init();
       slove();
       output();
       ;
 }

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. 阿里云Ubuntu 14.04 + Nginx + let's encrypt 搭建https访问

    参考页面: https://certbot.eff.org/#ubuntutrusty-nginx http://bbs.qcloud.com/thread-12059-1-1.html http:/ ...

  2. asp.net程序员初涉node.js

    之前一直听说node.js在处理网站大规模并发上十分有用,所以有一定规模的公司都在使用node.我在工作中只用过jquery,属于那种边做功能边学习的那一种.甚至连原生的js都不太会写,只是知道语法差 ...

  3. 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题

    1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...

  4. PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

    PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...

  5. Python【map、reduce、filter】内置函数使用说明(转载)

    转自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=admin 介绍下Python 中 map,reduce,和filter 内 ...

  6. pay-as-you-go

    What is pay as you go? A pay as you go deal means you aren’t tied into a contract and can top up you ...

  7. Entity Framework 出现 "此 ObjectContext 实例已释放,不可再用于需要连接的操作" 的错误

    原因 Entity的导航属性在View中使用,但是该Entity所在的Context已经在Controller中通过 using 释放掉:但是Entity又具有Deferred Query Evalu ...

  8. 【Alpha版本】冲刺阶段——Day 6

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  9. ubuntu下启动、关闭tomcat,查看tomcat运行日志

    启动:一般是执行sh tomcat/bin/startup.sh 停止:一般是执行sh tomcat/bin/shutdown.sh查看:执行ps -ef |grep tomcat 输出如下 *** ...

  10. 取消GridView/ListView item被点击时的效果 记录学习

    方法一,在控件被初始化的时候设置 gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); listView.setSelector(ne ...