//(x,y)连边的条件,选x就要选y vector<int> g[N]; int n,id[N],pre[N],low[N],s[N],stop,cnt,scnt; void tarjan(int v,int n){ int i,t,minc=low[v]=pre[v]=cnt++; s[stop++]=v; for(i=0;i<g[v].size();i++){ if(pre[g[v][i]]==-1) tarjan(g[v][i],n); if(low[g[v][i]]<minc) minc=low[g[v][i]]; } if(minc<low[v]){ low[v]=minc; return; } do{ id[t=s[--stop]]=scnt; low[t]=n; }while(t!=v); ++scnt; } bool _2sat(){ int i,h; stop=cnt=scnt=0; memset(pre,-1,sizeof(pre)); for(i=0;i<n;i++) if(pre[i]==-1) tarjan(i,n); h=n/2; for(i=0;i<h;i++) if(id[i]==id[i+h]) return false; return true; }