模板:强连通分量&2-sat

 1 void Tarjan(int x){
 2     low[x]=ID[x]=++tot;
 3     st[++top]=x;Inst[x]=true;
 4     for(int i=fir[x];i;i=nxt[i])
 5         if(!ID[to[i]]){
 6             Tarjan(to[i]);
 7             low[x]=min(low[x],low[to[i]]);
 8         }
 9         else if(Inst[to[i]])
10             low[x]=min(low[x],ID[to[i]]);
11     if(low[x]==ID[x]){
12         ++scnt;
13         while(true){
14             int y=st[top--];
15             scc[y]=scnt;
16             Inst[y]=false;
17             if(x==y)break;
18         }        
19     }
20 }
21 
22 bool Check(){
23     for(int i=0;i<n*2;i++)
24         if(!ID[i])Tarjan(i);
25     for(int i=0;i<n;i++)
26         if(scc[i*2]==scc[i*2+1])
27             return false;
28     return true;            
29 }

 http://blog.csdn.net/qq_24451605/article/details/47126143

原文地址:https://www.cnblogs.com/TenderRun/p/5634186.html