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

 

posted @ 2013-09-05 16:38  Yours1103  阅读(231)  评论(0编辑  收藏  举报