题目大意:
  有n个国家要派代表开会,每个国家有两个代表可供选择。
  有m对代表有仇,不能同时开会。
  若每个国家只能派一个代表开会,问是否存在一种方案,使得每个国家都能正常参会?
  如果有,输出字典序最小的一种。

思路:
  2-SAT经典模型。
  如果两个代表之间有仇,那么就给其中一个代表a连一条通向另一国家另一代表b的有向边,表示选a后一定要选b。
  判定时就用Tarjan缩点,如果同一国家两个代表在同一个强连通分量中,那么说明两个代表必须同时参加或不参加,这是不合法的。
  构造字典序最小的方案时,可以从小到大枚举每一个代表,然后DFS选定该代表后,必须选的其它代表,如果必须选的的代表和已选代表矛盾,则不加入。

 #include<stack>
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
std::stack<int> s;
std::vector<int> e[N<<];
bool ins[N<<],select[N<<];
int dfn[N<<],low[N<<],scc[N<<],cnt,id;
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
}
void tarjan(const int &x) {
s.push(x);
ins[x]=true;
dfn[x]=low[x]=++cnt;
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i];
if(!dfn[y]) {
tarjan(y);
low[x]=std::min(low[x],low[y]);
} else if(ins[y]) {
low[x]=std::min(low[x],dfn[y]);
}
}
if(low[x]==dfn[x]) {
id++;
int y=-;
while(y!=x) {
y=s.top();
s.pop();
ins[y]=false;
scc[y]=id;
}
}
}
bool dfs(const int &x) {
if(select[x^]) return false;
s.push(x);
select[x]=true;
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i];
if(select[y]) continue;
if(!dfs(y)) return false;
}
return true;
}
inline void reset(const int &n) {
cnt=id=;
for(register int i=;i<n<<;i++) {
dfn[i]=low[i]=select[i]=;
e[i].clear();
}
}
int main() {
int n,m;
while(~scanf("%d%d",&n,&m)) {
while(m--) {
const int u=getint()-,v=getint()-;
add_edge(u,v^);
add_edge(v,u^);
}
for(register int i=;i<n<<;i++) {
if(!dfn[i]) tarjan(i);
}
for(register int i=;i<n;i++) {
if(scc[i<<]==scc[i<<|]) {
puts("NIE");
goto Next;
}
}
for(register int i=;i<n<<;i++) {
if(!select[i]&&!select[i^]) {
if(dfs(i)) {
while(!s.empty()) s.pop();
} else {
while(!s.empty()) {
const int x=s.top();
s.pop();
select[x]=false;
}
}
}
}
for(register int i=;i<n<<;i++) {
if(select[i]) printf("%d\n",i+);
}
Next:
reset(n);
}
return ;
}

[POI2001]Peaceful Commission的更多相关文章

  1. hdu 1814 Peaceful Commission (2-sat 输出字典序最小的路径)

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)

    HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...

  3. Peaceful Commission

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...

  4. hdu1814 Peaceful Commission

    hdu1814 Peaceful Commission 题意:2-sat裸题,打印字典序最小的 我写了三个 染色做法,正解 scc做法,不管字典序 scc做法,错误的字典序贪心 #include &l ...

  5. HDOJ 1814 Peaceful Commission

    经典2sat裸题,dfs的2sat能够方便输出字典序最小的解... Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Mem ...

  6. 图论--2-SAT--HDU/HDOJ 1814 Peaceful Commission

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 Problem Description The Public Peace Commission ...

  8. 【HDU】1814 Peaceful Commission

    http://acm.hdu.edu.cn/showproblem.php?pid=1814 题意:n个2人组,编号分别为2n和2n+1,每个组选一个人出来,且给出m条关系(x,y)使得选了x就不能选 ...

  9. HDU-1814 Peaceful Commission 2sat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 简单的2sat题. //STATUS:C++_AC_390MS_996KB #include & ...

随机推荐

  1. ecplise中修改reviewboard密码

    一.概述 如果想在ecplise中修改reviewboard密码,步骤请参考如下图片:

  2. Spring学习--xml 中 Bean 的自动装配

    Spring IOC 容器可以自动装配 Bean. 只要在 <bean> 的 autowire 属性里指定自动装配的模式. byName(根据名称自动装配):必须将目标 Bean 的名称和 ...

  3. js介绍自己的例子

    js并不是真正面向对象的语言,但是我们通过一些方法也是可以实现js的一些面向对象设计的.常见的构造函数有很多模式有构造函数模式,原型链,工厂模式等等.但就是因为,我初学者看起来非常吃力,理解起来都是很 ...

  4. Android百度地图的使用

    做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一.申请AK(API Key) ...

  5. 【poj3420】递推式转矩阵乘法

    历史性的时刻!!! 推了一晚上!和hyc一起萌萌哒地推出来了!! 被摧残蹂躏的智商啊!!! 然而炒鸡高兴!! (请不要介意蒟蒻的内心独白..) 设a[i]为扫到第i行时的方案数. 易知,对于一行1*4 ...

  6. [POJ2187][BZOJ1069]旋转卡壳

    旋转卡壳 到现在依然不确定要怎么读... 以最远点对问题为例,枚举凸包上的两个点是最简单的想法,时间复杂度O(n2) 我们想象用两条平行线卡着这个凸包,当其中一个向某个方向旋转的时候另一个显然也是朝同 ...

  7. spoj p104 Matrix-Tree定理

    这个问题就是经典的生成树记数问题,题目为spoj p104 highway. 首先我们引入Matrix-Tree定理,由kirchhoff证明,定理的概述为,对于图G,我们定义若干个矩阵, D[G], ...

  8. (12)Linux shell之read 用法

    Linux shell之read 用法 #!/bin/bash#read 用来读取屏幕输入或是读取文件内容.read -p  "please input you  name: " ...

  9. 【bzoj4810】由乃的玉米田

    lxl丧心病狂-- 首先允许离线的区间询问一看就是莫队.那么我们看下怎么莫队? 不会. "由乃题多半是不可做的."于是我看了下题解--好吧果然是bitset 用bitset维护当前 ...

  10. hibernate基础学习

    转载自:http://blog.csdn.net/fb281906011/article/details/17628111 一:下载hibernate:http://hibernate.org/orm ...