您的位置:首页 > 其它

2-SAT

2015-10-03 10:34 211 查看
原理非常简单的啦。然而我做了一道模板题做了一个多小时。。

hdu3052:

WA了一个小时。我实在放弃了。于是上个厕所。突然想到了些什么,回到电脑前淡定的把一个+改成^。过了。。。早上真的学的太不顺利了。写了KMMLE。很认真找bug找了差不多一小时。继续MLE。。

○| ̄|_○| ̄|_○| ̄|_

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
int x=0;
char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return x;
}
const int nmax=1005;
vector<int>f[nmax*2];
int v[nmax*2],s[nmax*2],c,n,m;
void add(int a,int va,int b,int vb){
a=a*2+va;
b=b*2+vb;
f[a].push_back(b);
}
bool dfs(int x){
if(v[x^1]) return false;   //就是这里就是这里!!!!!!!
if(v[x]) return true;
v[x]=1;
s[c++]=x;
for(int i=0;i<f[x].size();i++){
if(!dfs(f[x][i]))
return false;
}
return true;
}
bool solve(){
for(int i=0;i<2*n;i+=2)
if(!v[i]&&!v[i+1]){
c=0;
if(!dfs(i)){
while(c>0)
v[s[--c]]=0;
if(!dfs(i+1))
return false;
}

}
return true;
}
void init(){
for(int i=0;i<2*n;i++)
f[i].clear();
clr(v,0);
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
rep(i,m){
int a=read(),b=read(),va=read(),vb=read();
add(a,va,b,vb^1);
add(b,vb,a,va^1);
}
//printf(solve()?"YES\n":"NO\n");
printf("%s\n",solve()?"YES":"NO");
}
return 0;
}


poj3905:ps:还是模板题

没错我又作死成功了没错没错。。。一直写的读入优化都没有遇到过负数的,然后这次就遇到了。于是我找找找,草read()怎么可能会有问题。跳过。看了好几遍之后才不得不看了下read()。不知道说些什么囧囧囧。加边这种写法更加简单一些。

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x));
int read(){
int x=0;int f=1;
char c=getchar();
while(!isdigit(c)) {
if(c=='-')           //这里这里这里!!!!
f=-1;
c=getchar();
}
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
const int nmax=1005;
vector<int>f[nmax*2];
int v[nmax*2],s[nmax*2],n,m,c;
void add(int a,int va,int b,int vb){
int x=a*2+va;
int y=b*2+vb;
f[x^1].push_back(y);
f[y^1].push_back(x);              //这样子写简单了点!!!
}
bool dfs(int x){
if(v[x^1]) return false;
if(v[x]) return true;
v[x]=1;
s[c++]=x;
for(int i=0;i<f[x].size();i++){
if(!dfs(f[x][i]))
return false;
}
return true;
}
bool solve(){
for(int i=0;i<2*n;i+=2){
if(!v[i]&&!v[i+1]){
c=0;
if(!dfs(i)){
while(c>0) v[s[--c]]=0;
if(!dfs(i+1))
return false;
}
}
}
return true;
}
void init(){
for(int i=0;i<2*n;i++)
f[i].clear();
clr(v,0);
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
rep(i,m){
int u=read(),v=read();
add(abs(u)-1,u<0?1:0,abs(v)-1,v<0?1:0);
}
printf("%d\n",solve()?1:0);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: