Description

题库链接

给出 \(T\) 个 \(N\) 个节点 \(M\) 条边的无向图(无重边自环),并给出它们各自的哈密顿回路。分别判断每个图是否是平面图。

\(T\leq 100,3\leq N\leq 200,M\leq 10000\)

Solution

考虑一个带哈密顿回路的无向图,如果它是一个平面图,即可以画在平面上使得没有 \(2\) 条边需要交叉,那么哈密顿圈之外的边要么画在圈内,要么画在圈外。

(绿色的环是哈密顿圈)

如果两条边 \(e,f\) ,把它们都画在圈的内侧会相交,那么都画在外侧也一定会相交。

也就是说,对于两条边,要么没有相互约束,要么有一条约束:它们不能在圈的同侧。

求出所有边和边的约束关系,用黑白染色法判断约束关系是否为二分图。

如果是二分图,则原图是平面图。否则原图不是平面图。

似乎 \(O(M^2)\) 暴力建边不可取,但注意到的是简单极大平面图的边数 \(M\) 和节点数 \(N\) 满足关系: \[M=3N-6\]

证明:
注意到平面图欧拉定理 \(n-m+r=2\) , \(n\) 个节点, \(m\) 条边, \(r\) 个面。
显然对于极大平面图 \(3r=2m\) ,带入得 \(m=3n-6\) 。

显然当 \(m>3n-6\) 时,这个图一定不是平面图,特判掉就好了。显然这时 \(n\) 与 \(m\) 同阶。复杂度得到了保障。

Code

//It is made by Awson on 2018.3.12
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 200, M = 10000;
void read(int &x) {char ch; bool flag = 0;for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());x *= 1-2*flag;
}
void print(int x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(int x) {if (x < 0) putchar('-'); print(Abs(x)); }int n, m, u[M+5], v[M+5], id[N+5], x;
struct tt {int to, next; }edge[(M<<5)+5];
int path[M+5], top, color[M+5];bool dfs(int o, int col) {color[o] = col;for (int i = path[o]; i; i = edge[i].next) {if (color[edge[i].to] == col) return false;if (color[edge[i].to] == -1) if (!dfs(edge[i].to, col^1)) return false;}return true;
}
void add(int u, int v) {edge[++top].to = v, edge[top].next = path[u], path[u] = top; }
void work() {read(n), read(m); top = 0; memset(path, 0, sizeof(path));for (int i = 1; i <= m; i++) read(u[i]), read(v[i]);for (int i = 1; i <= n; i++) read(x), id[x] = i;if (m > 3*n-6) {puts("NO"); return; }for (int i = 1; i <= m; i++) {if (id[u[i]] > id[v[i]]) Swap(u[i], v[i]);for (int j = 1; j < i; j++)if ((id[u[i]] < id[u[j]] && id[v[i]] < id[v[j]] && id[u[j]] < id[v[i]]) || (id[u[j]] < id[u[i]] && id[v[j]] < id[v[i]] && id[u[i]] < id[v[j]]))add(i, j), add(j, i);}for (int i = 1; i <= m; i++) color[i] = -1;for (int i = 1; i <= m; i++)if (color[i] == -1) if (dfs(i, 0) == 0) {puts("NO"); return; }puts("YES");
}
int main() {int t; read(t); while (t--) work(); return 0;
}

转载于:https://www.cnblogs.com/NaVi-Awson/p/8549372.html

[HNOI 2010]Planar相关推荐

  1. [HNOI 2010]Bounce 弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  2. 【HNOI 2010】Bounce 弹飞绵羊 分块

    BZOJ Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置 ...

  3. 简介SharePoint 2010 14 Hive文件夹

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/36018873 简介SharePoint 20 ...

  4. 在SharePoint 2010使用OWA查看自己邮箱的内容

    在SharePoint 2010使用OWA 背景: 利用 Outlook Web Access Web 部件,可以在 SharePoint 网站中显示从 Microsoft Exchange Serv ...

  5. 将moss 2007的模板文件导入到moss 2010

    最近公司HR请请将一个moss2007的调查模板文件导入到我们部门的Moss protal 上面. 我想这是举手之劳,就爽快的答应了. 但是导入时却报如下错误: Error Microsoft Sha ...

  6. [置顶]2010年东北大学ACM程序设计竞赛冬季校赛题解

    8题只做出4题比较easy的题,而且做得挺麻烦,看来还要多练练. AC的题如下 NEUOJ  1112 I Love Apple Description So many people love app ...

  7. 计算机接口与通信技术考试题,全国2010年10月自学考试计算机通信接口技术试题...

    全国2010年10月高等教育自学考试 计算机通信接口技术试题 课程代码:02369 注:接口芯片的控制字请参阅附录. 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项 ...

  8. 某单位招聘考试需要考核数学英语计算机,2010年10月自学考试电子商务网站设计原理试题...

    全国2010年10月高等教育自学考试 电子商务网站设计原理试题 课程代码:00906 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将 ...

  9. vs2008/2010安装无法打开数据文件解决方案

    本人在安装VS2008或2010时,在开始的第一个页面(进度条大约加载到75%左右),提示"无法打开数据文件 'C:/Documents and Settings/Administrator ...

最新文章

  1. 会计科目中英文对照表
  2. python 网络爬虫(一)
  3. docker 挂载空间到docker
  4. Protocol Buffers 在 iOS 中的使用
  5. 基于运维网V8环境安装ntop
  6. java(3)——数据类型中的数值型的整数类型
  7. 详解Python中的各种数字类型
  8. PSP金手指CMF_r21d修改版安装方法
  9. 导论II大作业提交-辩论计时器代码
  10. VC定时器SetTimer函数
  11. 对996的一些看法与个人价值实现
  12. liunx下载安装JDK1.8教程
  13. 瑞利商(Rayleigh Quotient)及瑞利定理(Rayleigh-Ritz theorem)的证明
  14. 让声音更清晰,用PR去掉视频中的噪音
  15. 建博第一天。。。希望每天都有进步,,加油!!!如你的昵称!!!
  16. android 角度传感器,的Android传感器旋转角度
  17. html输入时从本文框的顶格输入,浙江省绍兴市越城区2017—2018学年八年级第二学期期末语文试卷(15页)-原创力文档...
  18. 2021.11.14
  19. DeepGBM: A Deep Learning Framework Distilled by GBDT for Online Prediction Tasks
  20. C位出道后却遇前狼后虎,生鲜电商多点如何突围?

热门文章

  1. GitHub|基于强化学习自动化剪枝
  2. 学术 | 基于深度学习的图像边缘和轮廓提取方法介绍
  3. RoI Pooling 系列方法介绍(文末附源码)
  4. etc下没有mysql目录下_解决Linux安装mysql 在/etc下没有my.cnf的问题
  5. kibana 查询_干货 | Elasticsearch、Kibana数据导出实战
  6. LL1分析构造法_16条数学得分法,想提分快来看!
  7. 携程微服务框架实践及思考
  8. 基于人人网的Android开发流程介绍
  9. python 天勤 金叉 编程代码_Python量化策略开发框架,固定的套路、突破策略的福音...
  10. 数组对象的filter方法