[HNOI 2010]Planar
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;
}[HNOI 2010]Planar的更多相关文章
- $HNOI\ 2010$ 解题报告
		HNOI 2010 解题报告 0. HNOI2010 AC代码包下载地址 注: 戳上面的标题中的'地址' 下载 代码包, 戳下面每一题的文件名 可进入 题目链接. 每一题 对应代码的文件名 我在 每一 ... 
- 【BZOJ 2002】【Hnoi 2010】弹飞绵羊   分块||Link Cut Tree  两种方法
		ShallWe,Yveh,hmy,DaD3zZ,四人吃冰糕从SLYZ超市出来后在马路上一字排开,,,吃完后发现冰糕棍上写着:“向狮子座表白:愿做你的小绵羊”,,, 好吧在这道题里我们要弹飞绵羊,有分块 ... 
- bzoj 2002 HNOI 2010 弹飞绵羊
		Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ... 
- [HNOI 2010]Bus 公交线路
		Description 题库链接 有 \(N\) 个车站, \(K\) 条公交线路.第 \(1\) 到 \(K\) 站是这 \(K\) 线路的起点站.第 \(N-K+1\) 到 \(N\) 是终点站. ... 
- [HNOI 2010]chorus 合唱队
		Description 题库链接 对于一个包含 \(N\) 个整数的数列 \(A\) ,我们可以把它的所有元素加入一个双头队列 \(B\) . 首先 \(A_1\) 作为队列的唯一元素,然后依次加入 ... 
- [HNOI 2010]Bounce 弹飞绵羊
		Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ... 
- [HNOI 2010] 弹飞绵羊
		[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2002 [算法] LCT动态维护森林连通性 时间复杂度 : O(NlogN ^ 2) ... 
- HNOI 2010 物品调度 并查集 置换
		题意: 题意有点细,暂不概括.请仔细审题. 分析: 我们先要把c生成出来. 记得颜神讲这道题,首先表明,这道题有两个问题需要处理. 第一个是要先定位,第二个是要求最小移动步数. 定位时对于每一个物品i ... 
- NOIWC前的交流题目汇总
		RT 2018.12.27 i207M:BZOJ 4695 最假女选手 以维护最大值为例,记录最大值和严格次大值和最大值的出现次数,然后取min的时候递归到小于最大值但大于次大值修改,这个就是最重要的 ... 
随机推荐
- SpringMVC之处理流程
			之前在学servlet时写过JavaWeb与Asp.net工作原理比较分析,那篇主要是大致描述了下servlet的工作流程,今天在家了解了下springmvc的工作原理,与asp.net中的mvc进行 ... 
- 冲刺NO.11
			Alpha冲刺第十一天 站立式会议 项目进展 项目进入尾声,主要测设工作完成过半,项目总结也开始进行. 问题困难 项目的困难现阶段主要是测试过程中存在一些"盲点"很难发现或者发现后 ... 
- 团队作业7——第二次项目冲刺(Beta版本12.10)
			项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:头像功能原型设计.头像裁剪功能.头像上传功能.测试 计划完成的内容:头像功能测试.bug修复 每个人的工作 (有work item 的I ... 
- 大神都在看的RxSwift 的完全入坑手册
			大神都在看的RxSwift 的完全入坑手册 2015-09-24 18:25 CallMeWhy callmewhy 字号:T | T 我主要是通过项目里的 Rx.playground 进行学习和了解 ... 
- bzoj千题计划274:bzoj3779: 重组病毒
			http://www.lydsy.com/JudgeOnline/problem.php?id=3779 有一棵树,初始每个节点有不同的颜色 操作1:根节点到x的路径上的点 染上一种没有出现过的颜色 ... 
- mycat入门_介绍与安装
			利用闲暇时间接触了下mycat. 一.介绍 1.概述: 国内最活跃的.性能最好的开源数据库中间件,可以理解为数据库和应用层之间的一个代理组件. 2.作用: 读写分离.分表分库.主从切换. 3.原理: ... 
- dede使用心得
			Question one: 最近做了一些视频教程传到优酷网站上,但我想引入这些视频教程到我的网站,在发表时我发现织梦CMS自带的编辑器又不直接支持优酷等视频网站的引用.所以为了方便教程的发布,特意在网 ... 
- phalcon框架命名空间
			命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ... 
- MySQL“Another MySQL daemon already running with the same unix socket” 报错信息处理
			Mysql "Another Mysql daemon already running with the same unix socket" 解决办法:rm var/lib/mys ... 
- webpack你值得拥有-从四个核心配置谈起
			很久没有发文章了,但是强调一点,大-熊同学最近可没闲着.学习算法,复习计算机网络,也顺便学习了一下webpack,看了看操作系统(没办法,都没学,要是不学连实习笔试都过不了,伤心--).本来比较纠结是 ... 
