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