zoukankan      html  css  js  c++  java
  • POJ 3905

    加深了对有向边意义的理解了。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
    ");
     95                 flag=false;
     96                 break;
     97             }
     98         }
     99         if(flag)
    100         printf("1
    ");
    101     }
    102 }
    View Code
  • 相关阅读:
    ubuntu 下的中文输入法的安装和配置- ibus
    数据分析-序列处理(2)
    数据分析创建数据框与数据获取(1)
    Python的函数与方法的区别
    Python3笔记015
    Python3笔记014
    Python3笔记013
    Python3笔记012
    Python3笔记011
    Python3笔记010
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/3854680.html
Copyright © 2011-2022 走看看