这道题题意就是给你n对人,一对中编号为x,x+1,给你m对矛盾,表示这两个人不能同时选。

然后就是Two-Sat的模板题了,就是根据对称性,连边,加缩点,最后拓扑排序,求出一组可行解就可以了。

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring> using namespace std; typedef pair<int,int>pai;
const int NN=,MM=,INF=1e9+; bool flag=;
int n,m;
int cnt=,head[NN*],next[MM*],rea[MM*],cntr=,headr[NN*],nextr[MM*],rear[MM*];
int Time,top,low[NN*],dfn[NN*],minnum[NN*],stack[NN*],instack[NN*];
int sz,belong[NN*];
int fan[NN*],ru[NN*];
queue<int>ve[NN*]; struct Node
{
int x,y;
}a[MM]; void add(int u,int v)
{
cnt++;
next[cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
}
void add2(int u,int v)
{
cntr++;
nextr[cntr]=headr[u];
headr[u]=cntr;
rear[cntr]=v;
}
void Tarjan(int u)
{
dfn[u]=low[u]=++Time;
stack[++top]=u,instack[u]=true;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (dfn[v]==)
{
Tarjan(v);
low[u]=min(low[v],low[u]);
}
else if (instack[v]) low[u]=min(low[u],dfn[v]);
}
if (low[u]==dfn[u])
{
int x=-;
minnum[++sz]=INF;;
while (!ve[sz].empty()) ve[sz].pop();
while (x!=u)
{
x=stack[top--];
belong[x]=sz;
minnum[sz]=min(minnum[sz],x);//记录最小编号,发现对称的那个环的最小编号应该是该环最小编号的fan
ve[sz].push(x);
instack[x]=false;
}
}
}
void rebuild()
{
for (int i=;i<=*n;i++)
for (int j=head[i];j!=-;j=next[j])
{
int v=rea[j];
if (belong[i]!=belong[v])
{
ru[belong[v]]++;
add2(belong[i],belong[v]);
}
}//重构
}
bool cmp(int x,int y)
{
return x<y;
}
void solve()
{
int ans[NN*];
queue<int>q;
while (!q.empty()) q.pop();
for (int i=;i<=sz;i++)
if (!ru[i]) q.push(i);
bool biao[NN*]={};
top=;
while(!q.empty())
{
int u=q.front();
if (!biao[fan[minnum[u]]]) ans[++top]=u,biao[minnum[u]]=;
q.pop();
for (int i=headr[u];i!=-;i=nextr[i])
{
int v=rear[i];
ru[v]--;
if (!ru[v]) q.push(v);
}
}//拓扑的一个过程
bool booo=;
int res[NN],ll=;
for (int i=;i<=top;i++)
{
int x=ans[i];
while(!ve[x].empty())
{
res[++ll]=ve[x].front();
ve[x].pop();
}
}//ll最终等于n
sort(res+,res+ll+,cmp);
for (int i=;i<=ll;i++)
printf("%d\n",res[i]);
}
void init()
{
cntr=cnt=top=Time=sz=flag=;
memset(dfn,,sizeof(dfn));
memset(head,-,sizeof(head));
memset(headr,-,sizeof(headr));
memset(ru,,sizeof(ru));
for (int i=;i<=*n;i++)
if (i%==) fan[i]=i+;
else fan[i]=i-;
for (int i=;i<=m;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
add(fan[a[i].y],a[i].x);
add(fan[a[i].x],a[i].y);//刚开始连反向边并不影响正确率,而且在拓扑的时候不需要反向标记,方便许多。
}
}
void pan()
{
for (int i=;i<=*n;i+=)
if (belong[i]==belong[fan[i]])//如果一个块中,有编号一组的点,绝对不可以满足。
{
flag=;
return;
}
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
init();//初始化非常重要。
for (int i=;i<=n*;i++)
if (dfn[i]==) Tarjan(i);//tarjan一次
pan();
if (flag)
{
printf("NIE\n");
continue;
}
rebuild();
solve();
}
}

HIT 1917 Peaceful Commission的更多相关文章

  1. 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 ...

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

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

  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. [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列

    这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包 ...

  2. Linux io Model

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调 ...

  3. Redis 常用数据结构及其控制命令整合

    Redis 键值支持5种基本结构,分别是字符串,列表,哈希,集合,有序集合.每一种数据结构都有对应的取值和设值命令,辅助命令,除此之外,还有一些全局命令,用来管理Redis存储的所有 键. 全局命令 ...

  4. springmvc注解

    简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型) A.处理requet uri 部分(这里指uri templat ...

  5. 蓝桥杯PREV-11:横向打印二叉树

    嗯,没错我还报了蓝桥杯. 这是题目 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放 ...

  6. Java学习4——java常用命令

    javac  file.java 编译Java文件,生成file.class(字节码) java  file   执行Java程序,不加后缀.class java  -version 查看Java版本 ...

  7. 201521044091 《java程序设计》第八周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容.1.2 选做:收集你认为有用的代码片段 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1)1.1 实验 ...

  8. 使用Eclipse Egit与码云管理你的代码

    总体流程: 建立远程仓库 建立本地仓库并与远程仓库关联 将Eclipse中的项目提交到本地仓库并进而push到远程仓库 一. 配置Eclipse EGit 图解Eclipse中安装及配置EGit插件中 ...

  9. 关闭Sublime Text的自动更新的方法

    每次打开Sublime text 软件都会提示我让我更新软件,如图: 经过仔细的研究发现可以通过以下途径关闭软件的自动更新 打开Submine Text,找到Preferences -> Set ...

  10. JAVA课程设计——团队博客

    JAVA课程设计--团队博客 1. 团队名称.团队成员介绍(需要有照片) 团队名称:"小羊吃蓝莓"小游戏 团队成员介绍: 成员 班级 学号 廖怡洁 网络1513 201521123 ...