zoukankan      html  css  js  c++  java
  • HDU 3062

    2-SAT问题

    有必要写一下<i,j>边的含义。所谓,选i必选j的意思是,因为每一对中只能有一个被选,则矛盾的对中若其中一被选i,另一个不可能是j',因为存在矛盾,所以必选 j.

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 
     8 const int MAXN=2100;
     9 const int MAXM=1000000;
    10 
    11 int head[MAXN],stack[MAXN],dfn[MAXN],low[MAXN];
    12 int belong[MAXN],pat;
    13 int st[MAXN],stop;
    14 
    15 struct {
    16     int u,v;
    17     int next;
    18 }edge[MAXM];
    19 int n,m,tot,index;
    20 
    21 void init(){
    22     memset(head,-1,sizeof(head));
    23     for(int i=0;i<=2*n;i++){
    24         dfn[i]=low[i]=0;
    25         belong[i]=-1;
    26         stack[i]=0;
    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]=1;
    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]==1){
    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]=0;
    56             belong[v]=pat;
    57         }while(u!=v);
    58     }
    59 }
    60 
    61 int main(){
    62     int a1,a2,b1,b2;
    63     while(scanf("%d",&n)!=EOF){
    64         init();
    65         tot=0; index=0;
    66         pat=-1; stop=0;
    67         scanf("%d",&m);
    68         for(int i=1;i<=m;i++){
    69             scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
    70             addedge(2*a1+b1,((2*a2+b2)^1));
    71             addedge(2*a2+b2,((2*a1+b1)^1));
    72         }
    73         for(int i=0;i<2*n;i++){
    74             if(dfn[i]==0)
    75             tarjan(i);
    76         }
    77         bool flag=false;
    78         for(int i=0;i<n;i++){
    79             if(belong[2*i]==belong[2*i+1]){
    80                 printf("NO
    ");
    81                 flag=true;
    82                 break;
    83             }
    84         }
    85         if(!flag){
    86             printf("YES
    ");
    87         }
    88     }
    89     return 0;
    90 }
    View Code
  • 相关阅读:
    PHP chop() 函数
    PHP bin2hex() 函数
    多个表关联或者有视图套视图,快速检查SQL语句中所有的表统计信息是否过期
    洛谷P3628 [APIO2010]特别行动队 斜率优化
    洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
    bzoj4282 慎二的随机数列 树状数组求LIS + 构造
    校园网 入读统计 + 性质分析
    HAOI2006 受欢迎的牛 缩点
    普通平衡树 Treap
    洛谷P1563 玩具谜题 简单模拟
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/3854586.html
Copyright © 2011-2022 走看看