这道题题意就是给你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. Redis[三] @Hash 哈希

    Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型 在Redis中的哈希值,可存储超过400十亿键值对. redis 提供了2套操纵 一种是批量 一种是非批量 假设需 ...

  2. 给你的网站免费配置上 HTTPS 证书

    现在越来越多的网站或服务增加了 HTTPS 证书,苹果 AppStore.微信小程序等也已强制要求开发者需提供 HTTPS 的后端接口.在阿里云 / 腾讯云上有一年期的免费赛门铁克 SSL 证书可供尝 ...

  3. Vuejs 页面的区域化与组件封装

    组件的好处 当我用vue写页面的时候,大量的数据页面渲染,引入组件简化主页面的代码量,当代码区域块代码差不多相同时,组件封装会更加简化代码.组件是Vue.js最强大的功能之一. 组件可以扩展HTML元 ...

  4. 【转载】js常用方法和片段

    在网上看了不少js方法的总结没,自己也尝试总结过,这篇只迄今为止觉得最清楚的,尤其是call和apply的方法总结,很到位!! 1.javascript删除元素节点 IE中有这样一个方法:remove ...

  5. 201521123036 《Java程序设计》第10周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...

  6. Java:@Override标签的多态性详解

    Override(重写)是子类与父类的一种多态性体现. Override允许子类改变父类的一些行为. 为什么需要Override:当父类不满足子类的一些要求时我们就需要子类对父类的一些行为进行重写.  ...

  7. geyear和getfullyear的区别

    getYear(),IE中获得正确年份,但有的浏览器获取的是当前年份-1900的值.而IE是当大于2000时,直接加上1900 getFullYear(),都是可以获得正确年份. 所以建议使用getF ...

  8. Maven第四篇【私有仓库、上传jar包、引用私服jar包、上传本地项目到私服】

    搭建私有服务器 前面已经说过了,我们使用Maven的使用,如果需要导入相对应的jar包,Maven首先会在我们的本地仓库中寻找->私有仓库->中心仓库- 然而,我们的本地仓库常常没有想要的 ...

  9. 06jQuery-04-DOM操作

    jQuery既然是为了帮助你能从js的繁琐中解脱出来,自然在DOM操作上也有自己的一套. 1.修改Text和HTML 之前我们提到过,如果用JS的话,你要修改Text或者HTML需要用到其innerH ...

  10. Linux SSH 安装Tomcat

    tomcat的安装 1. 下载tomcat 从tomcat官网(http://tomcat.apache.org/download-70.cgi)下载tomcat的压缩包apache-tomcat-7 ...