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 }
View Code

相关文章:

  • 2022-01-13
猜你喜欢
  • 2021-06-06
  • 2022-02-03
相关资源
相似解决方案