bzoj 1997 Planar
题目大意:
给一个存在曼哈顿回路的无向图,求该图是否为平面图
思路:
先把曼哈顿回路提出来,则剩下的边的两个端点若有$ABAB$的形式则这两条边必定一个在环外一个在环内
对于这些边$2-SAT$即可
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<set> 11 #define ll long long 12 #define db double 13 #define inf 2139062143 14 #define MAXN 20100 15 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i) 16 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i) 17 #define ren for(register int i=fst[x];i;i=nxt[i]) 18 #define Fill(x,t) memset(x,t,sizeof(x)) 19 #define pb(i,x) vec[i].push_back(x) 20 #define pls(a,b) (a+b)%MOD 21 #define mns(a,b) (a-b+MOD)%MOD 22 #define mul(a,b) (1LL*(a)*(b))%MOD 23 using namespace std; 24 inline int read() 25 { 26 int x=0,f=1;char ch=getchar(); 27 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 28 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 29 return x*f; 30 } 31 int n,m,nxt[MAXN*100],fst[MAXN],to[MAXN*100],cnt,u[MAXN],v[MAXN],cir[MAXN]; 32 int dfn[MAXN],low[MAXN],bl[MAXN],stp,st[MAXN],top,scc,hsh[MAXN]; 33 void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;} 34 void mem() 35 { 36 Fill(fst,0);Fill(dfn,0);Fill(cir,0);Fill(bl,0); 37 cnt=stp=top=scc=0; 38 } 39 int p(int x) {return u[x]%n+1==v[x]||(v[x]==n&&u[x]==1);} 40 void tarjan(int x) 41 { 42 st[++top]=x,dfn[x]=low[x]=++stp; 43 ren if(!dfn[to[i]]) {tarjan(to[i]);low[x]=min(low[x],low[to[i]]);} 44 else if(!bl[to[i]]) low[x]=min(low[x],dfn[to[i]]); 45 if(low[x]==dfn[x]) 46 {scc++;int now=0;while(now!=x) now=st[top--],bl[now]=scc;} 47 } 48 int cheq(){rep(i,1,m) if(bl[i]==bl[i+m]&&cir[i]) return 0;return 1;} 49 int main() 50 { 51 int T=read();while(T--) 52 { 53 n=read(),m=read();mem();rep(i,1,m) u[i]=read(),v[i]=read(); 54 rep(i,1,n) hsh[read()]=i;if(m>3*n-6){puts("NO");continue;} 55 rep(i,1,m) {u[i]=hsh[u[i]],v[i]=hsh[v[i]];if(u[i]>v[i]) swap(u[i],v[i]);} 56 rep(i,1,m) cir[i]=1^p(i);rep(i,1,m) rep(j,1,m) 57 if(cir[i]&&cir[j]&&i^j&&u[i]<u[j]&&u[j]<v[i]&&v[i]<v[j]) 58 add(i+m,j),add(i,j+m),add(j,i+m),add(j+m,i); 59 rep(i,1,m<<1) if(!dfn[i]&&cir[i]) tarjan(i);puts(cheq()?"YES":"NO"); 60 } 61 }