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 }