題意:
婚礼上新郎新娘坐在桌子兩側 新娘只能看見對面的人 已知一些人有XX關系… 新娘不想看見有關系的同時坐在對面 問 滿足條件的情況下 新娘這邊做的人是誰
思路:
新郎那一邊的約束最多 有利於解題 那麼就變成了 一個人要不要坐新郎這邊的2-sat問題 因此可以先求新郎這邊的人 然後反一下就是新娘這邊的了 注意 新郎是必選點 而且 不能選和新郎有XX關系的…
代碼:
#include#include #include using namespace std; #define N 70 int n,m,tot,top,idx,cnt; int dfn[N],low[N],st[N],instack[N],belong[N],col[N],in[N],head[N],opt[N],qu[N]; struct edge { int u,v,next; }ed[N*N*2]; void add(int u,int v) { ed[tot].u=u; ed[tot].v=v; ed[tot].next=head[u]; head[u]=tot++; } void tarjan(int u) { int i,v; dfn[u]=low[u]=++idx; instack[u]=1; st[++top]=u; for(i=head[u];~i;i=ed[i].next) { v=ed[i].v; if(dfn[v]==-1) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]&&dfn[v]