加深了对有向边意义的理解了。2-SAT

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6 using namespace std;
  7 
  8 const int MAXN=2010;
  9 const int MAXM=2100100;
 10 
 11 int head[MAXN],dfn[MAXN],low[MAXN],st[MAXN],stop,belong[MAXN],tot,index,pat;
 12 bool stack[MAXN];
 13 struct {
 14     int u,v;
 15     int next;
 16 }edge[MAXM];
 17 int n,m;
 18 int s1,s2;
 19 
 20 void init(){
 21     stop=0; tot=0; index=0; pat=-1;
 22     for(int i=0;i<2*n;i++){
 23         head[i]=-1;
 24         dfn[i]=low[i]=0;
 25         belong[i]=-1;
 26         stack[i]=false;
 27     }
 28 }
 29 
 30 void addedge(int u,int v){
 31     edge[tot].u=u;
 32     edge[tot].v=v;
 33     edge[tot].next=head[u];
 34     head[u]=tot++;
 35 }
 36 
 37 void tarjan(int u){
 38     int v;
 39     dfn[u]=low[u]=++index;
 40     st[stop++]=u; stack[u]=true;
 41     for(int e=head[u];e!=-1;e=edge[e].next){
 42         v=edge[e].v;
 43         if(dfn[v]==0){
 44             tarjan(v);
 45             low[u]=min(low[u],low[v]);
 46         }
 47         else if(stack[v]){
 48             low[u]=min(low[u],dfn[v]);
 49         }
 50     }
 51     if(dfn[u]==low[u]){
 52         pat++;
 53         do{
 54             v=st[--stop];
 55             stack[v]=false;
 56             belong[v]=pat;
 57         }while(u!=v);
 58     }
 59 }
 60 
 61 int main(){
 62     int u,v;
 63     while(scanf("%d%d",&n,&m)!=EOF){
 64         init();
 65         for(int i=1;i<=m;i++){
 66             scanf("%d%d",&s1,&s2);
 67             u=abs(s1)-1;
 68             v=abs(s2)-1;
 69         //    cout<<u<<' '<<v<<endl;
 70             if(s1>0&&s2>0){
 71                 addedge(2*u,2*v+1);
 72                 addedge(2*v,2*u+1);
 73             }
 74             else if(s1>0&&s2<0){
 75                 addedge(2*u,2*v);
 76                 addedge(2*v+1,2*u+1);
 77             }
 78             else if(s1<0&&s2>0){
 79                 addedge(2*u+1,2*v+1);
 80                 addedge(2*v,2*u);
 81             }
 82             else{
 83                 addedge(2*u+1,2*v);
 84                 addedge(2*v+1,2*u);
 85             }
 86         }
 87         for(int i=0;i<2*n;i++){
 88             if(dfn[i]==0)
 89             tarjan(i);
 90         }
 91         bool flag=true;
 92         for(int i=0;i<n;i++){
 93             if(belong[i*2]==belong[i*2+1]){
 94                 printf("0\n");
 95                 flag=false;
 96                 break;
 97             }
 98         }
 99         if(flag)
100         printf("1\n");
101     }
102 }
View Code 优质内容筛选与推荐>>
1、《stl源码剖析》:仿函数、配接器
2、HTML5 学习笔记(二)——HTML5新增属性与表单元素
3、利用EasyMock生成数据库连接简单测试示例
4、IDEA中,将文件夹加入classpath
5、Nginx优化总结


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn