题目大意:
  有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. HDU3338:Kakuro Extension(最大流)

    Kakuro Extension Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. 本地上jar命令

    1.上传到jd-release mvn deploy:deploy-file -DgroupId=com.jd.open.api -DartifactId=open-api-sdk -Dversion ...

  3. ZOJ3872 Beauty of Array---规律 | DP| 数学能力

    传送门ZOJ 3872 Beauty of Array Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward has an array A  ...

  4. wiki 2490 导弹拦截塔

    2013-09-23 21:16 二分答案+匈牙利判断 对于每一个时间,我们重新建一张二分图,由于每个塔可能打多次,所以要拆点, 对于每个拆的点的可行飞行距离为(mid-t1)-(ll-1)*(t1+ ...

  5. python3 基础概念

    一.3.x新特性 1.print (),打印,3.x必须加括号 2.raw_input,3.x改为input   二.简介   Python是著名的“龟叔”Guido van Rossum在1989年 ...

  6. 在linux下搭建wiki环境【转】

    转自:http://blog.csdn.net/chy800/article/details/6906090 由于公司需要一个知识共享的系统,选择wiki来实现.经过准备决定使用Linux+xampp ...

  7. Tarjan & LCA 套题题目题解

    刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...

  8. Quorum一致性协议

    Quorum一致性协议 一个分布式数据库系统中通常是一系列密切关联的操作组成完整的系统. 分布式系统最基本的要保证一致性, 分区性通常是无法避免的, 在这种情况下尽力通过软件协议做到最大可用性. 根据 ...

  9. 5.flask知识点补充

    1.WTForms表单验证基本使用 flask-wtf是一个简化了WTForms操作的一个第三方库,WTForms表单的两个主要的功能jiushi就是验证用户提交数据的合法性以及渲染模板.当然还包括其 ...

  10. 【 Tomcat 】tomcat8.0 基本参数调优配置

    1.优化内核及TCP连接: fs.file-max = # 系统文件描述符总量 net.ipv4.ip_local_port_range = # 打开端口范围 net.ipv4.tcp_max_tw_ ...