http://cogs.pro:8080/cogs/problem/problem.php?pid=pyzQimjkj

题意:有n个集合,每个集合有俩元素,要从n个中各选一个放一堆,但是有的俩不能同时取,让你找出一种选取方案。

思路:2-SAT板子,主要学一下这个算法。算法流程:

构图:若a,b不能同时选,连a->b'和b->a'

求图的极大强连通子图:直接tarjan。

缩点然后变成个新的DAG:因为一个强连通分量里选一个其他都要选,一个不选其他都不能选,所以直接缩成一个点。

对新图拓排:要存反边,这个一开始不造为啥,后来看解释是因为传递的是不选择标记,这边往前代走,对面那边往后代走(对这个起作用)。。选一个他后代都得选,不选谁谁的前代都不能选,so...

自底向上进行选择,删除。

输出。

#include<bits/stdc++.h>
#define oth(x) x&1?x+1:x-1
using namespace std;
const int N = 20010; struct Edge{
int to,nxt;
}e[50010];
int head[N],dfn[N],low[N],st[N],bel[N];
bool vis[N];
int ru[N],q[N],opp[N],pr[N];
int tot_edge,n,nn,m,tot_node,top,cnt_block,L,R;
vector<int>mp[N]; inline int read() {
int x = 0,f = 1;char ch = getchar();
for (; ch<'0'||ch>'9'; ch=getchar()) if(ch=='-') f=-1;
for (; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
return x * f;
}
void add_edge(int u,int v){
e[++tot_edge].to = v;
e[tot_edge].nxt = head[u];
head[u] = tot_edge;
}
void tarjan(int u){
dfn[u] = low[u] = ++tot_node;
st[++top] = u;
vis[u] = true;
for(int i=head[u];i;i=e[i].nxt){
int v = e[i].to;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[v],low[u]);
}
else if(vis[v])
low[u] = min(dfn[v],low[u]);
}
if(low[u]==dfn[u]){
++cnt_block;
do{
vis[st[top]] = false;
bel[st[top]] = cnt_block;
top--;
}while(st[top+1]!=u);
}
}
void topsort(){
L=1;R=0;
for(int i=1;i<=cnt_block;i++){
if(ru[i]==0) q[++R] = i;
}
while(L<=R){
int u = q[L++];
if(pr[u]) continue;
pr[u] = 1;pr[opp[u]] = 2;
int sz = mp[u].size();
for(int i=0;i<sz;i++){
int v = mp[u][i];
ru[v]--;
if(ru[v]==0) q[++R] = v;
}
}
}
bool work(){
for(int i=1;i<=nn;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=1;i<=nn;i++){
if(bel[i]==bel[oth(i)]) return false;
opp[bel[i]] = bel[oth(i)];
opp[bel[oth(i)]] = bel[i];
}
for(int u=1;u<=nn;u++){
for(int i=head[u];i;i=e[i].nxt){
int v = e[i].to;
if(bel[u]!=bel[v]){
ru[bel[u]]++;
mp[bel[v]].push_back(bel[u]);
}
}
}
topsort();
return true;
}
int main(){
freopen("spo.in","r",stdin);
freopen("spo.out","w",stdout);
n = read(),m = read(),nn = n<<1;
for(int i=1;i<=m;i++){
int a = read(),b = read();
add_edge(a,oth(b));
add_edge(b,oth(a));
}
if(work()){
for(int i=1;i<=nn;i++){
if(pr[bel[i]]==1) cout<<i<<endl;
}
}
else puts("NIE");
return 0;
}

cogs 313. [POI2001] 和平委员会(2-SAT的更多相关文章

  1. COGS:313. [POI2001] 和平委员会

    313. [POI2001] 和平委员会 ★★☆   输入文件:spo.in   输出文件:spo.out   评测插件时间限制:1 s   内存限制:128 MB 题目描述 根据宪法,Bytelan ...

  2. [POI2001]和平委员会

    题目描述 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: 每个党派都在委 ...

  3. 【POI2001】【HDU1814】和平委员会

    题面 Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条 ...

  4. [模板]2-SAT 问题&和平委员会

    tarjan的运用 this is a problem:link 2-SAT处理的是什么 首先,把「2」和「SAT」拆开.SAT 是 Satisfiability 的缩写,意为可满足性.即一串布尔变量 ...

  5. HDU1814和平委员会

    题目大意: 有n对的人,编号从1-2*n,m对的人之间互相不喜欢,每对人中必徐选1个人加入和平委员会,求字典序最小的解 -------------------------------- 2-SAT问题 ...

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

  7. LOJ10097和平委员会

    POI 2001 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: 每个党 ...

  8. P5782-[POI2001]和平委员会【2-SAT】

    正题 题目链接:https://www.luogu.com.cn/problem/P5782 题目大意 \(n\)对人,每对之间恰好有一个人出席.\(m\)对仇恨关系表示两个人不能同时出席. 求是否有 ...

  9. 2-sat问题学习记录

    如果你不知道什么是sat问题,请看以下问答. Q:sat问题是什麽?A:首先你有n个布尔变量,然后你有一个关于这n个布尔变量的布尔表达式,问你,如果让你随意给这n个布尔变量赋值,这个布尔表达式能否成立 ...

随机推荐

  1. unc路径

    1.什么是UNC路径?UNC路径就是类似\\softer这样的形式的网络路径.UNC为网络(主要指局域网)上资源的完整 Windows 2000 名称.格式: \\servername\sharena ...

  2. .net core 实现基于 cron 表达式的任务调度

    .net core 实现基于 cron 表达式的任务调度 Intro 上次我们实现了一个简单的基于 Timer 的定时任务,详细信息可以看这篇文章. 但是使用过程中慢慢发现这种方式可能并不太合适,有些 ...

  3. Windows 下配置 Vagrant 环境

    Vagrant是一个基于 Ruby 的工具,用于创建和部署虚拟化开发环境.它使用 Oracle 的开源VirtualBox虚拟化系统. Vagrant 在快速搭建开发环境方面是很赞的,试想一个团队中, ...

  4. 【React踩坑记一】React项目中禁用浏览器双击选中文字的功能

    常规项目,我们只需要给标签加一个onselectstart事件,return false就可以 例: <div onselectstart="return false;" & ...

  5. 我的第一个py爬虫-小白(beatifulsoup)

    一.基本上所有的python第一步都是安装.安装 我用到的第三方安装包(beatifulsoup4.re.requests).还要安装lxml 二.找个http开头的网址我找的是url="h ...

  6. Android使用xUtils3上传图片报错解决:java.lang.ArrayIndexOutOfBoundsException: 70918

    今天在使用安卓xUtils3框架配合SmartUpload框架上传图片到Java服务端时,遇到了一个莫名其妙的错误: 安卓端代码如下: 似乎并没有发现什么问题,以前在用xUtils2.6老版本时也是这 ...

  7. Python 环境管理

    Python 版本管理器:pyenv zsh 配置 # 安装 curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv ...

  8. FLV协议5分钟入门浅析

    FLV协议简介 FLV(Flash Video)是一种流媒体格式,因其体积小.协议相对简单,很快便流行开来,并得到广泛的支持. 常见的HTTP-FLV直播协议,就是使用HTTP流式传输通过FLV封装的 ...

  9. sql语句优化:尽量使用索引避免全表扫描

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. npm install 安装很慢

    npm install 安装很慢 设置国内镜像 npm config set registry https://registry.npm.taobao.org npm install