cogs 313. [POI2001] 和平委员会(2-SAT
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的更多相关文章
- COGS:313. [POI2001] 和平委员会
313. [POI2001] 和平委员会 ★★☆ 输入文件:spo.in 输出文件:spo.out 评测插件时间限制:1 s 内存限制:128 MB 题目描述 根据宪法,Bytelan ...
- [POI2001]和平委员会
题目描述 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: 每个党派都在委 ...
- 【POI2001】【HDU1814】和平委员会
题面 Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条 ...
- [模板]2-SAT 问题&和平委员会
tarjan的运用 this is a problem:link 2-SAT处理的是什么 首先,把「2」和「SAT」拆开.SAT 是 Satisfiability 的缩写,意为可满足性.即一串布尔变量 ...
- HDU1814和平委员会
题目大意: 有n对的人,编号从1-2*n,m对的人之间互相不喜欢,每对人中必徐选1个人加入和平委员会,求字典序最小的解 -------------------------------- 2-SAT问题 ...
- 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 ...
- LOJ10097和平委员会
POI 2001 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: 每个党 ...
- P5782-[POI2001]和平委员会【2-SAT】
正题 题目链接:https://www.luogu.com.cn/problem/P5782 题目大意 \(n\)对人,每对之间恰好有一个人出席.\(m\)对仇恨关系表示两个人不能同时出席. 求是否有 ...
- 2-sat问题学习记录
如果你不知道什么是sat问题,请看以下问答. Q:sat问题是什麽?A:首先你有n个布尔变量,然后你有一个关于这n个布尔变量的布尔表达式,问你,如果让你随意给这n个布尔变量赋值,这个布尔表达式能否成立 ...
随机推荐
- unc路径
1.什么是UNC路径?UNC路径就是类似\\softer这样的形式的网络路径.UNC为网络(主要指局域网)上资源的完整 Windows 2000 名称.格式: \\servername\sharena ...
- .net core 实现基于 cron 表达式的任务调度
.net core 实现基于 cron 表达式的任务调度 Intro 上次我们实现了一个简单的基于 Timer 的定时任务,详细信息可以看这篇文章. 但是使用过程中慢慢发现这种方式可能并不太合适,有些 ...
- Windows 下配置 Vagrant 环境
Vagrant是一个基于 Ruby 的工具,用于创建和部署虚拟化开发环境.它使用 Oracle 的开源VirtualBox虚拟化系统. Vagrant 在快速搭建开发环境方面是很赞的,试想一个团队中, ...
- 【React踩坑记一】React项目中禁用浏览器双击选中文字的功能
常规项目,我们只需要给标签加一个onselectstart事件,return false就可以 例: <div onselectstart="return false;" & ...
- 我的第一个py爬虫-小白(beatifulsoup)
一.基本上所有的python第一步都是安装.安装 我用到的第三方安装包(beatifulsoup4.re.requests).还要安装lxml 二.找个http开头的网址我找的是url="h ...
- Android使用xUtils3上传图片报错解决:java.lang.ArrayIndexOutOfBoundsException: 70918
今天在使用安卓xUtils3框架配合SmartUpload框架上传图片到Java服务端时,遇到了一个莫名其妙的错误: 安卓端代码如下: 似乎并没有发现什么问题,以前在用xUtils2.6老版本时也是这 ...
- Python 环境管理
Python 版本管理器:pyenv zsh 配置 # 安装 curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv ...
- FLV协议5分钟入门浅析
FLV协议简介 FLV(Flash Video)是一种流媒体格式,因其体积小.协议相对简单,很快便流行开来,并得到广泛的支持. 常见的HTTP-FLV直播协议,就是使用HTTP流式传输通过FLV封装的 ...
- sql语句优化:尽量使用索引避免全表扫描
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- npm install 安装很慢
npm install 安装很慢 设置国内镜像 npm config set registry https://registry.npm.taobao.org npm install