NOIp2010 关押罪犯
二分+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 关押罪犯的更多相关文章
- 【洛谷P1525】[NOIP2010]关押罪犯
关押罪犯 题目链接 思路: 二分图或并查集 这里讲并查集算法: 1.将每对罪犯的冲突关系按影响从大到小排序 2.将集合与(i+n)合并表示编号为i的罪犯不能在该集合内 3.依次从大到小处理冲突关系: ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- TYVJ P1403 [NOIP2010]关押罪犯
TYVJ的编译器总是要搞点岔子出来,上次是double必须用f输出而不能用lf,这次又不知道为何CE 于是去了洛谷P1525测试,AC 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1 ...
- noip2010 关押罪犯 (vijos1776)
题目 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪 ...
- NOIP2010关押罪犯
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- NOIP2010 关押罪犯 (并查集)
若x,y有关系 将x与y的补集, y与x的补集建立关系 ; maxm=; ..maxm,..] of longint; f:..maxn*] of longint; i,j,m,n,x,y,z:lon ...
- [noip2010]关押罪犯 并查集
第一次看的时候想到了并查集,但是不知道怎么实现: 标解,f[i]表示i所属的集合,用f[i+n]表示i所属集合的补集,实现的很巧妙,可以当成一个使用并查集的巧妙应用: #include<iost ...
- NOIP2010关押罪犯 二分+二染色
这个题一上来 没有思路,后来想没有思路就二分吧 那么我们来二分 首先,大于当前的mid值的关系,不能出现在一个集合里 (即关系形成的图是一个二分图,判定二分图可以二染色) 如果不能形成二分图,那么说明 ...
- tyvj P1403 关押罪犯 题解
P1403 [NOIP2010]关押罪犯 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他 ...
随机推荐
- closure!
总结一下闭包. 闭包的定义:当一个内部函数被其外部函数之外的变量所引用时,就形成了一个闭包. 一个最简单的闭包: function A(){ var count=0; return function( ...
- 基于Html5缓存的页面P2P技术可行性探讨
P2P技术,在分享大文件(你懂的)是现在必不可缺的技术,现在的人,已经很难想象在没有这玩意的互联网早期,人们是怎样的艰难求生.想当年,不要说电影,下一个稍大点的文件,都是很吃力的事情. 后来牛人科恩, ...
- hihocoder1241 Best Route in a Grid
题目链接:hihocoder 1241 题意: n*n的格阵,每个方格内有一个数字.蚂蚁从左上角走到右下角,数字是零的方格不能走,只能向右向下走.蚂蚁走的路径上全部方格的的乘积为s,要使s低位0的个数 ...
- restFull常用注解
@GET.@POST.@PUT.@DELETE.@HEAD您可以使用它们来绑定根资源或子资源内的 Java 方法与 HTTP 请求方法.HTTP GET 请求被映射到由 @GET 注释的方法,以此类推 ...
- linux 配置 crontab
linux中的crontab是定时用的,下面的cron服务就是定时器的意思 crontab -l 列举所有的cron服务 crontab -e 修改cron服务 crontab -r 删除cron服务 ...
- CAP理论
自打引入CAP理论的十几年里,设计师和研究者已经以它为理论基础探索了各式各样新颖的分布式系统,甚至到了滥用的程度.NoSQL运动也将CAP理论当作对抗传统关系型数据库的依据. CAP理论主张任何基于网 ...
- Android自定义PopupWindow显示在控件上方或者下方
记录学习之用 View view = mInflater.inflate(R.layout.layout_popupwindow, null); PopUpwindowLayout popUpwind ...
- Java设计模式(七) 模板模式-使用钩子
1,模板类 package com.pattern.template; public abstract class CaffeineBeverageWithHook { void prepareRec ...
- Html+js 控制input输入框提示
<input type="text" class="fl plsearch_txt" id="key" value="请输入 ...
- Android GUI系统
图解Android - Android GUI 系统 (1) - 概论 图解Android - Android GUI 系统 (2) - 窗口管理系统 图解Android - Android GUI ...