HIT 1917 Peaceful Commission
这道题题意就是给你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的更多相关文章
- 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 ...
- hdu 1814 Peaceful Commission (2-sat 输出字典序最小的路径)
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Peaceful Commission
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu1814 Peaceful Commission
hdu1814 Peaceful Commission 题意:2-sat裸题,打印字典序最小的 我写了三个 染色做法,正解 scc做法,不管字典序 scc做法,错误的字典序贪心 #include &l ...
- HDOJ 1814 Peaceful Commission
经典2sat裸题,dfs的2sat能够方便输出字典序最小的解... Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Mem ...
- 图论--2-SAT--HDU/HDOJ 1814 Peaceful Commission
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 Problem Description The Public Peace Commission ...
- 【HDU】1814 Peaceful Commission
http://acm.hdu.edu.cn/showproblem.php?pid=1814 题意:n个2人组,编号分别为2n和2n+1,每个组选一个人出来,且给出m条关系(x,y)使得选了x就不能选 ...
- HDU-1814 Peaceful Commission 2sat
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 简单的2sat题. //STATUS:C++_AC_390MS_996KB #include & ...
随机推荐
- mysql存储过程 基本语法
话不多说 一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b& ...
- jumpserver-0.3.2 堡垒机环境搭建(图文详解)
下载安装包:https://github.com/jumpserver/jumpserver.git 解压 三.执行快速安装脚本 cd /opt/jumpserver/install pip inst ...
- Spring Aop 应用实例与设计浅析
0.代码概述 代码说明:第一章中的代码为了突出模块化拆分的必要性,所以db采用了真实操作.下面代码中dao层使用了打印日志模拟插入db的方法,方便所有人运行demo. 1.项目代码地址:https:/ ...
- java的jar包加密
由于项目要求(虽然我觉得代码没什么机密可言...),写好的jar包需要做一定加密处理 这里提供两种办法,一种奇葩,一种通用 1. 直接修改jar文件: 具体步骤: 在代码中插入一段不会运行的到的代码 ...
- 使用Sidecar将Node.js引入Spring Cloud
网上看到的一篇文章,觉得写得挺好,现转载于此,以方便需要的网友查阅. 该文章介绍了非JAVA语言提供的应用集成到Spring Cloud的这样一个实现,以便我们使用其他语言作为参考. 感谢原作者分享, ...
- Cassandra HBase和MongoDb性能比较
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp68这是一篇基于亚马逊云平台上对三个主流的NoSQL数据库性能比较,在读写 ...
- 第4阶段——制作根文件系统之编译配置安装busybox(3)
在上一节分析出制作一个最小的根文件系统至少需要: (1)/dev/console(终端控制台, 提供标准输入.标准输出以及标准错误) /dev/null (为空的话就是/dev/null, 所有写到 ...
- 二,ESP8266 GPIO和SPI和定时器和串口
让这个灯亮 我们写lua用这个软件 链接:http://pan.baidu.com/s/1kVN09cr 密码:pfv7 http://www.cnblogs.com/yangfengwu/p/624 ...
- 【★】KMP算法完整教程
KMP算法完整教程 全称: Knuth_Morris_Pratt Algorithm(KMP算法) 类型: ...
- MPLS VPN随堂笔记3
跨域 ASBR之间运行MPBGP 1.配置AS内部IGP保证环回口互相可达,同时建立LDP邻居 (优先启用 mpls label rang 16 100)方便查看实验现象 2.配置PE1-PE2 PE ...