这道题题意就是给你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. mysql 插入字段 字符串

     update hand_over set pay_info='{"waring_tip":"{\"pay_order_cancel\":0,\&qu ...

  2. node.js的fs核心模块读写文件操作 -----由浅入深

    node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 - 同步和异步共存 ,有异步不用同步 - fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFil ...

  3. C语言格式化输入输出

    %i和%d之间的区别 作为匹配整数的转换说明,printf格式串中两者并没有区别,但是在scanf格式串中%d只能匹配十位制整数,而%i可以匹配八进制(前缀为0,如086).十进制或十六进制(前缀0x ...

  4. Linux-chown命令(1)

    chown  [chang owner]:更改文件的属主,也就是指定文件的拥有者改为另一个指定的用户或组. 命令格式: chown [选项]... [用户][:[组]] 文件... 例子:  sudo ...

  5. 从web图片裁剪出发:了解H5中的Blob

    刚开始做前端的时候,有个功能卡住我了,就是裁剪并上传头像.当时两个方案摆在我面前,一个是flash,我不会.另一个是通过iframe上传图片,然后再上传坐标由后端裁剪,而我最终的选择是后者.有人会疑惑 ...

  6. AppiumDesktop用法介绍

    转自:http://www.jianshu.com/p/bf1ca3d4ac76 写这篇文章的心情 真的很开心,我看着官网介绍竟然对AppiumDesktop略懂皮毛了.今天特意写出来,希望可以帮助一 ...

  7. SNS团队Beta阶段第三次站立会议(2017.05.24)

    1.立会照片 2.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 辅助完善生词本 辅助完成生词本功能 龚晓婷 辅助开发历史记录功能 辅助完善历史记录功能 林仕庄 开发历史记录功能 完 ...

  8. 201521123103 《Java学习笔记》 第八周学习总结

    一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 集合部分:TreeMap实现类:对键值进行排序. Map的entrySet Set<Map.Entry&l ...

  9. 201521123080《Java程序设计》第2周学习总结

    1.本周学习总结 a.学习了如何建立远程仓库和本地仓库并建立连接. b.学习了一些基础语法. 2.书面作业 Q1.使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)?分析Str ...

  10. [转载]Eclipse自定义快捷键导出和导入方法

    背景: 以前做C/C++开发,习惯了Visual Studio这个强大的IDE,转到安卓开发后,用到蛋疼的Eclipse,实在不习惯,而且以前总觉得VS不流畅,现在才知道VS很好,才知道什么是真正的& ...