P3209 [HNOI2010]平面图判定
哈密尔顿环之外的任意一条边,要么连在环内部,要么连在环外部
判断两条边在同一部分会相交,则这两条边必须分开
那么把边看作点连边,跑二分图染色就行
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- typedef long long LL;
- const LL maxn=500000;
- inline LL read(){
- LL x=0,f=1; char c=getchar();
- while(c<'0'||c>'9'){
- if(c=='-') f=-1; c=getchar();
- }
- while(c>='0'&&c<='9'){
- x=x*10+c-'0'; c=getchar();
- }return x*f;
- }
- struct node{
- LL to,next;
- }dis[maxn];
- LL T,num,n,m;
- LL head[maxn],belong[maxn],edge[maxn][2],a[maxn];
- bool f;
- inline void Add(LL u,LL v){
- dis[++num]=(node){v,head[u]}; head[u]=num;
- }
- inline bool Check(LL u1,LL v1,LL u2,LL v2){
- return (u1<u2&&u2<v1&&v1<v2)||(u2<u1&&u1<v2&&v2<v1);
- }
- bool Dfs(LL u,LL c){
- belong[u]=c;
- for(LL i=head[u];i;i=dis[i].next){
- LL v=dis[i].to;
- if(belong[v]==c)
- return false;
- if(!belong[v]&&!Dfs(v,3-c))
- return false;
- }
- return true;
- }
- int main(){
- T=read();
- while(T--){
- n=read(),m=read();
- for(LL i=1;i<=m;++i)
- edge[i][0]=read(),
- edge[i][1]=read();
- for(LL i=1;i<=n;++i)
- a[read()]=i;
- if(m>3*n-6){
- printf("NO\n");
- continue;
- }
- memset(head,0,sizeof(head)); num=0;
- for(LL i=1;i<=m;++i)
- for(LL j=i+1;j<=m;++j){
- LL u1=a[edge[i][0]],v1=a[edge[i][1]];
- LL u2=a[edge[j][0]],v2=a[edge[j][1]];
- if(u1>v1)
- swap(u1,v1);
- if(u2>v2)
- swap(u2,v2);
- if(Check(u1,v1,u2,v2)){
- Add(i,j);
- Add(j,i);
- }
- }
- f=false;
- memset(belong,0,sizeof(belong));
- for(LL i=1;i<=m;++i)
- if(!belong[i])
- if(!Dfs(i,1)){
- f=true;
- break;
- }
- if(f)
- printf("NO\n");
- else
- printf("YES\n");
- }
- return 0;
- }
P3209 [HNOI2010]平面图判定的更多相关文章
- Luogu P3209 [HNOI2010]平面图判定(2-SAT)
P3209 [HNOI2010]平面图判定 题意 题目描述 若能将无向图\(G=(V,E)\)画在平面上使得任意两条无重合顶点的边不相交,则称\(G\)是平面图.判定一个图是否为平面图的问题是图论中的 ...
- 洛谷 P3209 [HNOI2010] 平面图判定
链接: P3209 题意: 给出 \(T\) 张无向图 \((T\leq100)\),并给出它对应的哈密顿回路,判断每张图是否是平面图. 分析: 平面图判定问题貌似是有线性做法的,这里给出链接,不是本 ...
- 洛谷P3209 [HNOI2010]平面图判定(2-SAT)
传送门 看到哈密顿回路就被吓傻了……结果没有好好考虑性质…… 首先,平面图有个性质:边数小于等于$3n-6$(我也不知道为啥),边数大于这个的直接pass 然后考虑原图,先把哈密顿回路单独摘出来,就是 ...
- bzoj1997 [HNOI2010]平面图判定Plana
bzoj1997 [HNOI2010]平面图判定Planar 链接 bzoj luogu 思路 好像有很多种方法过去.我只说2-sat 环上的边,要不在里面,要不在外边. 有的边是不能同时在里面的,可 ...
- [BZOJ1997][HNOI2010] 平面图判定
Description Input Output 是的..BZOJ样例都没给. 题解(from 出题人): 如果只考虑简单的平面图判定,这个问题是非常不好做的. 但是题目中有一个条件— ...
- [HNOI2010]平面图判定
Description: 若能将无向图 \(G=(V, E)\) 画在平面上使得任意两条无重合顶点的边不相交,则称 \(G\) 是平面图.判定一个图是否为平面图的问题是图论中的一个重要问题.现在假设你 ...
- Luogu3209 HNOI2010 平面图判定 平面图、并查集
传送门 题意:$T$组数据,每组数据给出一个$N$个点,$M$条边,并存在一个$N$元环的图,试判断其是否为一个可平面图(如果存在一种画法,使得该图与给出的图同构且边除了在顶点处以外互相不相交,则称其 ...
- [HNOI2010] 平面图判定 planar
标签:二分图判定.题解: 首先可以把题目中给你的那个环给画出来,这样就可以发现对于任意一个图来说,如果两条边要相交,就不能让他们相交,那么这两条边就要一条在里面一条在外面,如果把环画成一条链,那么就是 ...
- BZOJ1997 HNOI2010 平面图判定 planar (并查集判二分图)
题意 判断一个存在哈密顿回路的图是否是平面图. n≤200,m≤10000n\le200,m\le10000n≤200,m≤10000 题解 如果一定存在一个环,那么连的边要么在环里面要么在外面.那么 ...
随机推荐
- ubuntu下C/C++编程起步
1. 安装VMware虚拟机软件 2. 在VMware中安装linux系统,这里安装的是Ubuntu.(用 VMware 安装 Ubuntu 12.04详细过程图解) 3. ubuntu有自带文本编辑 ...
- z pre-pass 相关问题的讨论
z pre-pass 是指在渲染流程中,第一个pass先画一张深度buffer出来,得到需要绘制的最前面这层深度,用这个在接下来的pass中做深度剔出,这样在第二个pass中会省略很多绘制. 这项技术 ...
- 由内省引出JavaBean的应用
IntroSpector-->javaBean-->特殊的java类 get和set方法 ReflectPoint pt1 = new ReflectPoint(3,5); String ...
- linux中expr用法
名称:expr ### 字串长度 shell>> expr length "this is a test" 14 ### 数字商数 shell>> ...
- 2014年辛星解读Javascript之DOM高速入门
在Javascript的知识中,有一个所谓的DOM.即文档对象模型,我们能够通过它来訪问HTML文档的元素,当网页被载入的时候,浏览器会去创建DOM,有了这个DOM.我们能够使用Javascript去 ...
- 微信小程序 - 考试前三排名实现
实现原理:利用背景图片以及nth-child实现
- Android使用OKHttp3实现下载(断点续传、显示运行进度)
OKHttp3是现在很流行的Android网络请求框架,那么怎样利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用R ...
- dedecms织梦后台password忘记了怎么办?dedecms织梦后台password忘记怎样找回password?
方法一:自己用解密的方式 用phpmyadmin登陆后台数据库,查看 找到password:去除前三位和后一位,然后拷贝到http://www.cmd5.com/在线解密工具里面解密 watermar ...
- ExtJs4学习(一):正确认识ExtJs4
认识ExtJs 1.Javat能用ExtJs吗? 它是展现层的技术,与JS,HTML,CSS有关.至于server端是.Net,还是PHP等无关. 2.ExtJs适合什么样的项目? 依照官方的说法,E ...
- p90x 涵盖了全部方式的健身方式美国经典训练DVD
http://baike.baidu.com/view/2602721.htm p90x是美国经典训练DVD, 涵盖了全部方式的健身方式13张Beachbody P90X DVD全集,90天魔鬼训练 ...