bzoj1997: [Hnoi2010]Planar
2-SAT。
首先有平面图定理 m<=3*n-6,如果不满足这条件肯定不是平面图,直接退出。
然后构成哈密顿回路的边直接忽略。
把哈密顿回路当成一个圆,
如果俩条边交叉(用心去感受),只能一条边在圆内,另一条在圆外。
这个是2-sat的A,B要不同时取,要不同时不取模型。
如果俩个交叉,只能一个在内,一个在外。
和A,B俩者不能同时取有区别,需要注意。
可能存在3个方案(A,B’),(B,A’),(A’,B’)。
连方案都不要,直接tarjan完就过了。
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- const int maxn = 10000 + 10;
- const int maxm = 3000000 + 10;
- int g[maxn],v[maxm],next[maxm],eid;
- int a[maxn],b[maxn],c[maxn],pos[maxn];
- bool t[maxn];
- int vis[maxn];
- int s[maxn],sp;
- int dfn[maxn],low[maxn],vid;
- int color[maxn],cid;
- int T,n,m;
- void addedge(int a,int b) {
- v[eid]=b; next[eid]=g[a]; g[a]=eid++;
- v[eid]=a; next[eid]=g[b]; g[b]=eid++;
- }
- bool build() {
- scanf("%d%d",&n,&m);
- for(int i=1;i<=m;i++) scanf("%d%d",&a[i],&b[i]);
- for(int i=1;i<=n;i++) {
- scanf("%d",&c[i]);
- pos[c[i]]=i;
- }
- if(m>3*n-6) {
- printf("NO\n");
- return false;
- }
- memset(g,-1,sizeof(g)); eid=0;
- memset(t,0,sizeof(t));
- for(int i=1;i<=m;i++) {
- a[i]=pos[a[i]];
- b[i]=pos[b[i]];
- if(a[i]>b[i]) swap(a[i],b[i]);
- }
- for(int i=1;i<=m;i++)
- if(a[i]+1==b[i] || (a[i]==1&&b[i]==n)) t[i]=true;
- for(int i=1;i<=m;i++) if(!t[i]) {
- for(int j=1;j<=m;j++) if(i!=j && !t[j])
- if(a[i]<a[j] && a[j]<b[i] && b[i]<b[j]) {
- addedge((i<<1),(j<<1)|1);
- addedge((i<<1)|1,(j<<1));
- }
- }
- return true;
- }
- void tarjan(int u) {
- dfn[u]=low[u]=++vid;
- vis[u]=1; s[++sp]=u;
- for(int i=g[u];~i;i=next[i]) {
- if(!vis[v[i]]) {
- tarjan(v[i]);
- low[u]=min(low[u],low[v[i]]);
- }
- else if(vis[v[i]]==1)
- low[u]=min(low[u],dfn[v[i]]);
- }
- if(dfn[u]==low[u]) {
- ++cid;
- do {
- color[s[sp]]=cid;
- vis[s[sp]]=2;
- }while(s[sp--]!=u);
- }
- }
- void solve() {
- memset(vis,0,sizeof(vis));
- vid=cid=sp=0;
- for(int i=1;i<=m;i++) if(!t[i]) {
- if(!vis[i<<1]) tarjan(i<<1);
- if(!vis[i<<1|1]) tarjan((i<<1|1));
- }
- for(int i=1;i<=m;i++) if(!t[i]&&color[i<<1]==color[i<<1|1]) {
- printf("NO\n");
- return;
- }
- printf("YES\n");
- }
- int main() {
- scanf("%d",&T);
- while(T--) if(build()) solve();
- return 0;
- }
bzoj1997: [Hnoi2010]Planar的更多相关文章
- [bzoj1997][Hnoi2010]Planar(2-sat||括号序列)
开始填连通分量的大坑了= = 然后平面图有个性质m<=3*n-6..... 由平面图的欧拉定理n-m+r=2(r为平面图的面的个数),在极大平面图的情况可以代入得到m=3*n-6. 网上的证明( ...
- bzoj千题计划231:bzoj1997: [Hnoi2010]Planar
http://www.lydsy.com/JudgeOnline/problem.php?id=1997 如果两条边在环内相交,那么一定也在环外相交 所以环内相交的两条边,必须一条在环内,一条在环外 ...
- [BZOJ1997][Hnoi2010]Planar 2-sat (联通分量) 平面图
1997: [Hnoi2010]Planar Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2317 Solved: 850[Submit][Stat ...
- BZOJ1997 [Hnoi2010]Planar 【2-sat】
题目链接 BZOJ1997 题解 显然相交的两条边不能同时在圆的一侧,\(2-sat\)判一下就好了 但这样边数是\(O(m^2)\)的,无法通过此题 但是\(n\)很小,平面图 边数上界为\(3n ...
- BZOJ1997 [Hnoi2010]Planar (2-sat)
题意:给你一个哈密顿图,判断是不是平面图 思路:先找出哈密顿图来.哈密顿回路可以看成一个环,把边集划分成两个集合,一个在环内,一个在外.如果有两条相交边在环内,则一定不是平面图,所以默认两条相交边,转 ...
- bzoj1997 [Hnoi2010]Planar——2-SAT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997 神奇的经典2-SAT问题! 对于两个相交的区间,只能一里一外连边,所以可以进行2-SA ...
- 【BZOJ1997】[Hnoi2010]Planar 2-SAT
[BZOJ1997][Hnoi2010]Planar Description Input Output Sample Input 2 6 9 1 4 1 5 1 6 2 4 2 5 2 6 3 4 3 ...
- bzoj1997 [HNOI2010]平面图判定Plana
bzoj1997 [HNOI2010]平面图判定Planar 链接 bzoj luogu 思路 好像有很多种方法过去.我只说2-sat 环上的边,要不在里面,要不在外边. 有的边是不能同时在里面的,可 ...
- BZOJ 1997: [Hnoi2010]Planar( 2sat )
平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...
随机推荐
- 环信ipv6适配
环信2.2.5及之后版本才适配了ipv6.可以自己搭配个ipv6环境,在ipv6环境下2.2.5以下版本无法登录.把整个sdk换成2.2.5版本项目需要改动的地方实在太多. 那么就部分换一下,适配ip ...
- sql2008 计划自动创建数据库分区【转】
本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...
- javascript_22_for_js性感的v
<script type="text/javascript"> window.onload=function(){ var aDiv=document.getEleme ...
- Problem 1014 xxx游戏 暴力+拓扑排序
题目链接: 题目 Problem 1014 xxx游戏 Time Limit: 1000 mSec Memory Limit : 32768 KB 问题描述 小M最近很喜欢玩XXX游戏.这个游戏很简单 ...
- eclipse中加放js文件报js语法错误解决办法
1) eclipse设置 window->preference-> JavaScript -> Validator->Errors/Warnings->E ...
- linux进程管理之服务
init进程首先通过initable查看运行级别,然后运行rc.d下面的sysinit,然后调用rc,然后运行rc###连接到init.d下面的服务.自启动. chkconfig命令只是查看和设置服 ...
- 2014 Multi-University Training Contest 3
官方解题报告http://blog.sina.com.cn/s/blog_a19ad7a10102uyiq.html Wow! Such Sequence! http://acm.hdu.edu.cn ...
- 已收录的帝国cms文章被误删除了怎么办?
我们一直提倡网站要经常备份,但是有时也会遗忘,一不小心被谁删除了那就欲哭无泪了.就像ytkah刚弄了一个站,开了个权限比较高的后台帐号给别人用,居然把两三个栏目都删除了,想发狂啊.刚好又有段时间没备份 ...
- Searching a 2D Sorted Matrix Part I
Write an efficient algorithm that searches for a value in an n x m table (two-dimensional array). Th ...
- mac上eclipse上运行word count
1.打开eclipse之后,建立wordcount项目 package wordcount; import java.io.IOException; import java.util.StringTo ...