poj 3905 2-sat
很奇怪很奇怪的一件事情
输入的时候用scanf ("%s%s",s1,s2)竟然错了
最后无语的换了下输入,建图不难的
#include<stdio.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; const int MAX = 2011; vector<int> edge[MAX]; int st[MAX]; int dfn[MAX],low[MAX]; int top,btype,tdfn;//btype:Á¬Í¨¿éµÄ¸öÊý int belong[MAX];//µãÊôÓÚÄĸöÁ¬Í¨¿é bool ins[MAX]; void dfs(int s) { int i,t; dfn[s]=low[s]=++tdfn; ins[s]=true; st[++top]=s; for(i=0;i<edge[s].size();i++) { t=edge[s][i]; if(!dfn[t]) { dfs(t); if(low[t]<low[s]) low[s]=low[t]; } else if(ins[t] && dfn[t]<low[s]) low[s]=dfn[t]; } if(dfn[s]==low[s]) { btype++; do { t=st[top--]; ins[t]=false; belong[t]=btype; }while(t!=s); } } void SCC(int n) { int i; top=btype=tdfn=0; memset(ins,false,sizeof(ins)); memset(dfn,0,sizeof(dfn)); for(i=1;i<=n;i++) if(!dfn[i]) dfs(i); } int main() { int n,m,i; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=2*n;i++) edge[i].clear(); for(i=0;i<m;i++) { for (i = 0; i < m; i++) { int rx,ry,x,y; scanf("%d%d",&x,&y); if (x > 0) rx = x + n; else { rx = -x; x = rx + n; } if (y > 0) ry = y + n; else { ry = -y; y = ry + n; } edge[rx].push_back(y); edge[ry].push_back(x); } } SCC(2*n); bool flag=true; for(i=1;i<=n;i++) if(belong[i]==belong[i+n]) flag=false; if(flag) printf("1\n"); else printf("0\n"); } return 0; }