twoset基本思想:有n个党派,每个党派有2个人,要求每个党派都要选出一个人,每个人之间可能存在互斥关系,判断最后能否选出这N个人来
const int MAXN=20020; const int MAXM=100010; struct Edge { int to,next; }edge[MAXM]; int head[MAXN],tot; void init() { tot=0; memset(head,-1,sizeof(head)); } void addedge(int u,int v) { edge[tot].next=head[u]; edge[tot].to=v; head[u]=tot++; } bool vis[MAXN]; int S[MAXN],top; bool dfs(int u) { if(vis[u^1]) return false; if(vis[u]) return true; vis[u]=true; S[top++]=u; for(int i=head[u];i!=-1;i=edge[i].next) { if(!dfs(edge[i].to)) return false; } return true; } bool Twosat(int n)//这里的n代表一共有n个人,(0,1),(2,3)(4,5)代表同一个党派 { memset(vis,false,sizeof(vis)); for(int i=0;i<n;i+=2) { if(vis[i]||vis[i^1]) continue; top=0; if(!dfs(i)) { while(top) vis[S[--top]]=false; if(!dfs(i^1)) return false; } } return true; }