题目大意:给出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 ;
}

最新文章

  1. 利用JS实现购物网站商品放大镜效果
  2. iOS XCode启用/关闭Clang Warnings
  3. 基于吉日嘎拉的通用权限管理WebForm版扩展:字典选项管理和缓存管理
  4. oracle触发器设置uuid变量
  5. How to change statusbar text color to dark on android 4.4
  6. GRE学习日志
  7. [POI 2008]Mafia
  8. Objective-C语法汇总
  9. 公交CPU卡原理
  10. python学习笔记20(字符串格式化)
  11. JS页面赋值
  12. Centos/linux下的JDK安装
  13. 关于 Form 表单的 enctype 属性
  14. [linux-脚本]shebang(shabang #!)
  15. KNN-笔记(1)
  16. django的母板系统
  17. 【Java】-NO.11.Java.1.Log4j.1.001-【Log4j Manual】-
  18. Java NIO系列教程(五)Buffer
  19. APPium-Xpath,swipe练习
  20. 78. Subsets(M) &amp; 90. Subsets II(M) &amp; 131. Palindrome Partitioning

热门文章

  1. 【插件开发】—— 13 GEF双击模型事件
  2. 标准字符cp功能
  3. javascript 冒泡与捕获的原理及操作实例
  4. /bin,/sbin,/usr/sbin,/usr/bin 目录之简单区别
  5. [POI2007]大都市meg
  6. Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
  7. jmeter(八)HTTP属性管理器HTTP Cookie Manager、HTTP Request Defaults
  8. 230 Kth Smallest Element in a BST 二叉搜索树中第K小的元素
  9. 不重启IIS修改dotnet framework版本
  10. AJPFX总结Java 类与对象的初始化