zoukankan      html  css  js  c++  java
  • hdu 1824

    也是一道2-sat的入门题;

    不过题目描述的不清楚,看了别人的题解才知道题意;

    和上面的那题差不多,一个模板;

    代码:

     1 #include<cstdio>
     2 #include<stack>
     3 #include<vector>
     4 #include<algorithm>
     5 #include<cstring>
     6 #define maxn 20010
     7 using namespace std;
     8 
     9 vector<int>ve[maxn];
    10 stack<int>s;
    11 int low[maxn],dfn[maxn],b[maxn],nncount,cnt;
    12 bool instack[maxn];
    13 
    14 void tarjin(int u)
    15 {
    16     low[u]=dfn[u]=++nncount;
    17     s.push(u);
    18     instack[u]=1;
    19     int l=ve[u].size();
    20     for(int i=0;i<l;i++)
    21     {
    22         int v=ve[u][i];
    23         if(!dfn[v])
    24         {
    25             tarjin(v);
    26             low[u]=min(low[u],low[v]);
    27         }
    28         else if(instack[v])
    29             low[u]=min(low[u],dfn[v]);
    30     }
    31     if(low[u]==dfn[u])
    32     {
    33         cnt++;
    34         int v;
    35         do
    36         {
    37             v=s.top();
    38             s.pop();
    39             b[v]=cnt;
    40             instack[v]=0;
    41         }while(v!=u);
    42     }
    43 }
    44 
    45 int main()
    46 {
    47     int n,m,x,y,z,t;
    48     while(scanf("%d%d",&t,&m)!=EOF)
    49     {
    50         n=3*t;
    51         for(int i=0;i<2*n;i++)
    52             ve[i].clear();
    53         memset(low,0,sizeof low);
    54         memset(dfn,0,sizeof dfn);
    55         memset(b,0,sizeof b);
    56         nncount=cnt=0;
    57         for(int i=0;i<t;i++)
    58         {
    59             scanf("%d%d%d",&x,&y,&z);
    60             ve[x+n].push_back(y);
    61             ve[x+n].push_back(z);
    62             ve[y+n].push_back(x);
    63             ve[z+n].push_back(x);
    64         }
    65         for(int i=0;i<m;i++)
    66         {
    67             scanf("%d%d",&x,&y);
    68             ve[x].push_back(y+n);
    69             ve[y].push_back(x+n);
    70         }
    71         bool flag=0;
    72         for(int i=0;i<2*n;i++)
    73             if(!dfn[i]) tarjin(i);
    74         for(int i=0;i<n;i++)
    75             if(b[i]==b[i+n]) {flag=1;break;}
    76         if(flag) puts("no");
    77         else puts("yes");
    78     }
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    powershell查看pc信息的常用命令
    OSPF_Network-type
    redistribute and Suboptimal routing
    redistribute_prefix
    分发列表
    自增和自减
    逻辑运算
    判断闰年
    XenApp简单部署
    使用git将本地文件提交到github存储库
  • 原文地址:https://www.cnblogs.com/yours1103/p/3303612.html
Copyright © 2011-2022 走看看