vector<int> G[N<<1];
int n;
bool mark[N<<1];
int S[N<<1],c;
void init()
{
for(int i=0;i<2*n;i++) G[i].clear();
clr(mark,0);
}
bool dfs(int x){
if(mark[x^1]) return 0;
if(mark[x]) return 1;
mark[x]=1;
S[c++] =x;
for(int i=0;i<G[x].size();i++)
if(!dfs(G[x][i])) return 0;
return 1;
}
bool solve(){
for(int i=0;i<(n*2);i+=2){
if(!mark[i]&&!mark[i+1]){//这组点不知道要选那个
c=0;
if(!dfs(i)){ //选这个点不行
while(c>0) mark[S[--c]]=0;//这个整个依赖关系崩溃
if(!dfs(i+1)) return 0;
}
}
}
return 1;
}
int low[N<<1],dfn[N<<1],idx;
stack<int> st;int inst[N<<1];
int scc[N<<1],sccno;
vector<int> G[N<<1];
int n;
void init()
{
for(int i=0;i<=2*n;i++) G[i].clear();
while(!st.empty()) st.pop();
clr(dfn,0);
clr(inst,0);
idx=sccno=0;
}
void tarjan(int x){
low[x] = dfn[x]=++idx;
st.push(x);
inst[x]=1;
for(int i=0;i<G[x].size();i++)
{
int v=G[x][i];
if(!dfn[v]){
tarjan(v);
low[x] = min(low[v],low[x]);
}
else if(inst[v]){
low[x]= min(low[x],dfn[v]);
}
}
if(low[x]==dfn[x]){
++sccno;
int v;
do{
v=st.top();
st.pop();
inst[v]=0;
scc[v]=sccno;
}while(x!=v);
}
}
bool solve(){
for(int i=0;i<2*n;i++)
if(!dfn[i]) tarjan(i);
for(int i=0;i<2*n;i+=2)
{
if(scc[i]==scc[i^1]) return false;
}
return true;
}
模板之后是建模,随缘吧