luogu 2-SAT 问题
2024-08-30 20:29:14
题目大意:给出n个bool变量,以及m个条件,条件为x,vx,y,vy,表示 x == vx || y == vy 。
求匹配。
题解:
最近新学了一下2-SAT算法。2-SAT指有若干个bool变量(显然有1/0两个值),还给出若干限定条件,比如:
t1 || t2
t1 || !t2
t1 && t2
t1 && -t2
等等。
然后要求找匹配方案。
首先大家应该听过差分约束,差分约束是用最短路处理数的大小关系等问题。
而2-SAT就高级多了,他是将关系映射到图上,然后用tarjan等方法判断情况是否存在。
具体操作是:
若t1成立则t2一定成立,就从t1向t2连一条边。
比如本题(t1成立或t2成立):
! t1 -> t2
! t2 -> t1
然后看看$i$和$i+n( !i )$是否在一个集里,在的话就不合法。
最后跑tarjan缩点,按拓扑逆序处理状态。由于tarjan是正向跑的,那就在$bel [ i ]<bel[ n + i ]$时输出1,要么输出0。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1000050
int n,m,hed[*N],cnt;
struct EG
{
int to,nxt;
}e[*N];
void ae(int f,int t)
{
e[++cnt].to = t;
e[cnt].nxt = hed[f];
hed[f] = cnt;
}
int dep[*N],low[*N],tim;
int s[*N],tl;
bool vis[*N];
int bel[*N],bc;
void tarjan(int u)
{
dep[u]=low[u]=++tim;
s[++tl]=u;
vis[u]=;
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(!dep[to])
{
tarjan(to);
low[u]=min(low[u],low[to]);
}else if(vis[to])
{
low[u]=min(low[u],dep[to]);
}
}
if(dep[u]==low[u])
{
bc++;
int c=-;
while(c!=u)
{
c=s[tl--];
vis[c]=;
bel[c]=bc;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int x,vx,y,vy;
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&x,&vx,&y,&vy);
ae(x+vx*n,y+(!vy)*n);
ae(y+vy*n,x+(!vx)*n);
}
for(int i=;i<=*n;i++)
if(!dep[i])
tarjan(i);
for(int i=;i<=n;i++)
{
if(bel[i]==bel[i+n])
{
printf("IMPOSSIBLE\n");
return ;
}
}
printf("POSSIBLE\n");
for(int i=;i<=n;i++)
{
printf("%d ",bel[i]<bel[i+n]);
}
printf("\n");
return ;
}
最新文章
- 利用JS实现购物网站商品放大镜效果
- iOS XCode启用/关闭Clang Warnings
- 基于吉日嘎拉的通用权限管理WebForm版扩展:字典选项管理和缓存管理
- oracle触发器设置uuid变量
- How to change statusbar text color to dark on android 4.4
- GRE学习日志
- [POI 2008]Mafia
- Objective-C语法汇总
- 公交CPU卡原理
- python学习笔记20(字符串格式化)
- JS页面赋值
- Centos/linux下的JDK安装
- 关于 Form 表单的 enctype 属性
- [linux-脚本]shebang(shabang #!)
- KNN-笔记(1)
- django的母板系统
- 【Java】-NO.11.Java.1.Log4j.1.001-【Log4j Manual】-
- Java NIO系列教程(五)Buffer
- APPium-Xpath,swipe练习
- 78. Subsets(M) &; 90. Subsets II(M) &; 131. Palindrome Partitioning
热门文章
- 【插件开发】—— 13 GEF双击模型事件
- 标准字符cp功能
- javascript 冒泡与捕获的原理及操作实例
- /bin,/sbin,/usr/sbin,/usr/bin 目录之简单区别
- [POI2007]大都市meg
- Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
- jmeter(八)HTTP属性管理器HTTP Cookie Manager、HTTP Request Defaults
- 230 Kth Smallest Element in a BST 二叉搜索树中第K小的元素
- 不重启IIS修改dotnet framework版本
- AJPFX总结Java 类与对象的初始化