题意

判断一个存在哈密顿回路的图是否是平面图。

n≤200,m≤10000n\le200,m\le10000n≤200,m≤10000

题解

如果一定存在一个环,那么连的边要么在环里面要么在外面。那么把在同侧会矛盾的边之间连边,如果是一个二分图就是平面图。

有问题的是边数是O(m2)O(m^2)O(m2)的。但是可以发现当m>n∗3−6m>n*3-6m>n∗3−6的时候一定形成不了平面图。所以就判一下,如果小于等于就O(m2)O(m^2)O(m2)做。

证明:先画出一条环,有nnn条边,然后这个环的一个点向非相邻的n−3n-3n−3个点连接n−3n-3n−3条边可以保证两两不相交,外面一侧如此,故如果边数m>n∗3−6m>n*3-6m>n∗3−6,就直接判断NONONO即可。保证了复杂度。

判二分图的方法可以用带权并查集或者直接染色,这里写的是带权并查集。

CODE

#include <bits/stdc++.h>
using namespace std;
inline void rd(int &x) {
char ch; for(;!isdigit(ch=getchar()););
for(x=ch-'0';isdigit(ch=getchar());)x=x*10+ch-'0';
}
const int MAXN = 205;
const int MAXM = 10005;
int n, m, u[MAXM], v[MAXM], seq[MAXN], id[MAXN];
int d[MAXM], fa[MAXM];
int find(int x) {
if(x != fa[x]) {
int old = fa[x];
fa[x] = find(fa[x]);
d[x] ^= d[old];
}
return fa[x];
}
int main() {
int T; rd(T); while(T--) {
rd(n), rd(m);
for(int i = 1; i <= m; ++i) rd(u[i]), rd(v[i]);
for(int i = 1; i <= n; ++i) rd(seq[i]), id[seq[i]] = i;
if(m > 3*n-6) puts("NO");
else {
bool flg = 1;
for(int i = 1; i <= m && flg; ++i) {
fa[i] = i; d[i] = 0;
int l = min(id[u[i]], id[v[i]]);
int r = max(id[u[i]], id[v[i]]);
for(int j = 1; j < i && flg; ++j)
if(id[u[j]] != l && id[u[j]] != r && id[v[j]] != l && id[v[j]] != r && ((l <= id[u[j]] && id[u[j]] <= r)^(l <= id[v[j]] && id[v[j]] <= r))) {
int u = find(i), v = find(j);
if(u == v) flg &= (d[i] != d[j]);
else fa[u] = v, d[u] = d[i] ^ d[j] ^ 1;
}
}
puts(flg ? "YES" : "NO");
} }
}

最新文章

  1. 041. asp.net中内容页访问母版页中的控件
  2. 《The Linux Command Line》 读书笔记04 Linux用户以及权限相关命令
  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置
  4. spring 源码下载地址
  5. 怎么直接在MySQL客户端上执行SQl文件?
  6. 既然HTTP1.1协议里每个连接默认都是持久连接,那么为何当今所有报文都在使用Connetion:Keep-Alive
  7. 给定范围内产生N个不同的随机数
  8. 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类
  9. ORA-02396: exceeded maximum idle time, please connect again的原因
  10. [编码解码] Base64 编码换行和+号遍空格的处理
  11. 老李分享:网页爬虫java实现
  12. CSS书写规范与理论
  13. js 解决两值交换
  14. Oracle报错ORA-12516 TNS:listener could not find available handler with matching protocol stack
  15. 原生js及H5模拟鼠标点击拖拽
  16. Python之旅Day5 列表生成式 生成器 迭代器 装饰器
  17. android app使用微信登录接口回调没有被执行的问题研究
  18. 请使用千位分隔符(逗号)表示web网页中的大数字
  19. C++ 矩阵库 eigen
  20. kaptcha验证码使用

热门文章

  1. Quartz.Net—TriggerBuilder
  2. Spring Boot 入门(九):集成Quartz定时任务
  3. vue导入css,js和放置html代码
  4. 机器学习-HMM隐马尔可夫模型-笔记
  5. 全面优化MySQL
  6. 手动编译ts的经过
  7. 第二次用map23333
  8. ES与关系型数据库的通俗比较
  9. [转载]Linux下非root用户如何安装软件
  10. 远程 Linux(Ubuntu 18)添加字体