HDU 3062 简单的2-SAT问题
2024-08-28 23:00:22
在2-SAT,最让我纠结的还是添加有向线段的函数了
void add_clause(int i,int a,int j,int b)
{
int m=2*i+a;
int n=2*j+b;
G[m^1].push_back(n);
G[n^1].push_back(m);
}
这里a,b因为只有真假两种情况,所以只取0或1,这里表示m V n是正确的,那么意思是取到m^1时,那么n必然得取到
同理取到n^1时,m必然取到,所以两条有向线段就添加成功了
例如这道题给所有夫妻排好序后,1号夫妻的丈夫,和3号夫妻的妻子有矛盾,那么来1号的妻子或3号中的丈夫是肯定成立的
那添加量就可以写成add_clause(1,0,3,1) (0表示妻子,1表示丈夫)
最后添加进去的就是G[3].push_back(7),G[6].push_back(2);
表示1号的丈夫来了,那只能让3号的丈夫来以及
要是3号的妻子来,那么只能让1号的妻子来才不会有矛盾
bool solve()
{
for(int i=0;i<2*n;i+=2){
if(!mark[i]&&!mark[i^1]){
c=0;
if(!dfs(i)){
while(c>0) mark[S[--c]]=0;
if(!dfs(i^1)) return false;
}
}
}
return true;
}
solve()中查找遍所有的夫妻对,表示当且仅当夫妻二人都不能来的时候返回false,否则返回true
总代码如下:
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define N 1005*2
bool mark[N];
vector<int> G[N];
int n,c,S[N];
bool dfs(int i)
{
if(mark[i^]) return false;
if(mark[i]) return true;
mark[i]=true;
S[c++]=i;
for(int j=;j<G[i].size();j++)
if(!dfs(G[i][j])) return false;
return true;
}
void init()
{
for(int i=;i<N;i++) G[i].clear();
memset(mark,false,sizeof(mark));
memset(S,,sizeof(S));
}
void add_clause(int i,int a,int j,int b)
{
int m=*i+a;
int n=*j+b;
G[m^].push_back(n);
G[n^].push_back(m);
}
bool solve()
{
for(int i=;i<*n;i+=){
if(!mark[i]&&!mark[i^]){
c=;
if(!dfs(i)){
while(c>) mark[S[--c]]=;
if(!dfs(i^)) return false;
}
} }
return true;
}
int main()
{
int m,a1,a2,c1,c2;
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<m;i++){
scanf("%d%d%d%d",&a1,&a2,&c1,&c2);
add_clause(a1,c1^,a2,c2^);
}
if(solve()) printf("YES\n");
else printf("NO\n");
}
return ;
}
最新文章
- Asp.Net MVC4 + Oracle + EasyUI 学习 序章
- POJ 3177 Redundant Paths(边双连通的构造)
- AngularJs学习笔记--bootstrap
- AWS Summit 2014 San Francisco站总结
- android 运行 python
- 【BZOJ】【1927】【SDOI2010】星际竞速
- python自省指南
- PDO扩展使用方法
- 网站压力测试工具Webbench介绍
- sphinx multi valued filter
- Github+Hexo,搭建专有博客
- Atomikos和GTS-Fescar和TCC-Transaction和TX-LCN分布式事物的比较
- 归并排序——Merge Sort
- 论文阅读:Videos as Space-Time Region Graphs
- java编程IO简单回顾和学习
- Asp连接Oracle (包含绿色版12.2客户端和ODBC驱动安装)
- tarjan算法讲解
- linux命令学习——cat
- activiti主要API对象
- http协议基础(四)http状态码
热门文章
- D. Tavas and Malekas DFS模拟 + kmp + hash || kmp + hash
- QQ面板拖拽(慕课网DOM事件探秘)(上)
- DOCTYPE详解
- android动画之通过子线程来实现动画
- Linux安装技巧--安装Uuntu与windows8/10共存
- [Github筆記] 清除所有 Commit 紀錄
- 回顾Spring MVC_01_概述_入门案例
- sqlserver 数据库主外键关联错误
- Windows虚拟桌面
- Window服务程序(windows service application)如何调试