hdu 3062 2-sat
#include<stdio.h>
#include<string.h>
#define N 2100
struct node {
int u,v,next;
}bian[N*N];
int min(int a,int b) {
return a>b?b:a;
}
int yong,dfn[N],low[N],ans[N],stac[N],top,index,num,head[N],visit[N];
void addedge(int u,int v) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void tarjan(int u) {
dfn[u]=low[u]=++index;
stac[++top]=u;
visit[u]=1;
int i;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v ;
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
}
else
if(visit[v]==1)
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]) {
++num;
int t;
do{
t=stac[top--];
ans[t]=num;
visit[t]=2;
}while(t!=u);
}
}
int main(){
int n,m,i,j,ii,jj,a,b,c,d;
while(scanf("%d%d",&n,&m)!=EOF) {
yong=0;index=0;num=0;top=0;//初始化
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(head,-1,sizeof(head));
memset(stac,0,sizeof(stac));
memset(ans,0,sizeof(ans));
memset(visit,0,sizeof(visit));
while(m--) {
scanf("%d%d%d%d",&a,&b,&c,&d);
i=a*2+c;
j=b*2+d;
if(c==0)
ii=i+1;
else
ii=i-1;
if(d==0)
jj=j+1;
else
jj=j-1;
addedge(i,jj);
addedge(j,ii);
}
for(i=0;i<2*n-1;i++)
if(visit[i]!=2)
tarjan(i);
for(i=0;i<n;i++)
if(ans[i*2]==ans[i*2+1])
break;
if(i==n)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
最新文章
- CSS布局设计
- [Bundling and Minification ] 一、如何绑定
- 0406.复利计算器5.0版-release
- Java中断言的使用(转)
- 通达OA 公共文件柜二次开发添加管理信息(图文)
- css3 Transition动画执行时有可能会出现闪烁的bug
- 如何为WPF添加Main()函数 程序入口点的修改
- animate CSS动画程序接口(仅Chrome可用)
- sql server日期字段值的比较
- Asp.Net MVC 上传图片到数据库
- Tomcat+Eclipse乱码问题解决方法
- C++学习笔记1(扩充:C++中的格式控制)
- C#开发移动应用系列(3.使用照相机扫描二维码+各种基础知识)
- bzoj3289 Mato的文件管理 莫队+树状数组
- Android 添加第三方jar包
- Codeforces Round #449 Div. 1
- PHP实现流程管理功能
- C++ StrCat()
- 制作dlib(面部识别检测)静态库
- Webpack+React项目入门——入门及配置Webpack