这道题题意就是给你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. JSON取值(key是中文或者数字)方式详解

    JSON取值(key是中文或者数字)方式详解 先准备一个json对象用于演示 var json = {'name':'zhangsan', '年龄':23, 404:'你可能迷路了'}; 使用JS中w ...

  2. Docker 集群环境实现方式

    Docker 集群环境实现的新方式 近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展 ...

  3. log4j与log4j.properties的配置

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt233 摘要: 一.配置步骤 1.  在应用程序中使用log4j 2.  把l ...

  4. C语言中指针*p[N], (*P)[N],及**p的区别

    在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...

  5. 201521123091 《Java程序设计》第3周学习总结

    Java 第三周总结 第三周的作业. Java 第三周总结 1.本章学习总结 2.Java Q&A 1.代码阅读 2.构造函数有什么用?其编写格式是什么?如果一个类不写构造函数,它有构造函数吗 ...

  6. 201521123061 《Java程序设计》第十一周学习总结

    201521123061 <Java程序设计>第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 本周学习的是如何解决多线程访问中的互斥 ...

  7. 201521123059 《Java程序设计》第十四周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1.关系型数据库 --建立表格时表中一列中的数据类型必须一致.关系表中的行必须是唯一的,列是不可分的,某些行的某 ...

  8. 201521123080《Java程序设计》第14周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 书面作业 MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) ...

  9. 201521123099 《Java程序设计》 第10周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? final ...

  10. 【java】聊聊java里的接口

    接口的概念 java中的接口用于描述类应该具备什么样的功能,而不给出具体的实现,一个类可以“实现”多个接口 [注意]接口不是类,而是对类的一组描述   还是让我们通过一个例子来看看接口如何运作吧!   ...