https://www.lydsy.com/JudgeOnline/problem.php?id=1997

https://www.luogu.org/problemnew/show/P3209

若能将无向图G=(V,E)画在平面上使得任意两条无重合顶点的边不相交,则称G是平面图。判定一个图是否为平面图的问题是图论中的一个重要问题。现在假设你要判定的是一类特殊的图,图中存在一个包含所有顶点的环,即存在哈密顿回路。

m>3*n+6显然为NO。

有一个想法就是把哈密顿回路当成一个壳,枚举每一条边,再枚举另一条边,很容易通过哈密顿序来判断两边是否相交。

那么此时相交是否输出NO呢?并不是。

(我纠结在这里,后来发现我游戏都白玩了,有一个解绳子的游戏,思考一下就知道可以把壳内的边移到壳外就可以解决矛盾。)

于是分成了两个区域:壳内和壳外。用并查集维护一下就行了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
const int N=;
const int M=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int u,v;
}e[M];
int n,m,pos[N],t[N],fa[M*];
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
inline bool unionn(int x,int y){
int x1,y1;
if(find(x)==find(y))return ;
x1=find(x),y1=find(y+m);
if(x1!=y1)fa[x1]=y1;
x1=find(x+m),y1=find(y);
if(x1!=y1)fa[x1]=y1;
return ;
}
inline bool pan(int i,int j){
int xi=pos[e[i].u],yi=pos[e[i].v];
int xj=pos[e[j].u],yj=pos[e[j].v];
if(xi>yi)swap(xi,yi);
if(xj>yj)swap(xj,yj);
if(xi>xj)swap(xi,xj),swap(yi,yj);
return xi<xj&&xj<yi&&yi<yj;
}
int main(){
int T=read();
while(T--){
bool ok=;
n=read(),m=read();
for(int i=;i<=m;i++){
e[i].u=read(),e[i].v=read();
}
for(int i=;i<=n;i++)t[i]=read(),pos[t[i]]=i;
if(m>*n+){puts("NO");continue;}
for(int i=;i<=*m;i++)fa[i]=i;
for(int i=;i<=m&&ok;i++){
for(int j=i+;j<=m&&ok;j++){
if(pan(i,j)){
ok=unionn(i,j);
}
}
}
if(!ok)puts("NO");
else puts("YES");
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

最新文章

  1. 充电时间 Go中的数组、切片、map简单示例
  2. jquery 点击查看更多箭头变化,文字变化,超出带滚动条。
  3. android JSON获取值String无法转换成JSONObject
  4. 【iCore3 双核心板_FPGA】实验二十六:SDRAM读写测试实验
  5. NSIS脚本入门和进阶方法
  6. chrome下input[type=text]的placeholder不垂直居中的问题解决
  7. 驱动模式使用__try __excpet
  8. COJ 0047 20702最大乘积
  9. 我的MYSQL学习心得(七)
  10. postal邮件发送(一):基本配置
  11. HSDFS fs命令
  12. ADO.NET通用类库
  13. 计蒜客NOIP模拟赛D2T3 数三角形
  14. DOS窗口如何实现复制粘贴
  15. mybatis自动填充时间字段
  16. 使用paginate分页后数据处理
  17. cocos CCLayer glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);ios11闪退 spine动画
  18. SpringMVC 与 REST.
  19. 使用Docker部署javaWeb应用
  20. 我发起了一个 网格计算 协议 开源项目 GridP

热门文章

  1. C#中Mutex的用法
  2. HTTP与IIS知识点
  3. Allure--自动化测试报告生成
  4. grep命令及正则
  5. lesson 24 A skeleton in the cupboard
  6. Java开发工程师(Web方向) - 04.Spring框架 - 第1章.Spring概述
  7. 小程序button 去边框
  8. POJ - 3259
  9. spark操作数据库的几种方法
  10. 正则表达式 和 re 模块