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

平面图的一个定理:若边数大于(3*点数-6),则该图不是平面图。

然后就可以2-SAT了!

注意把输入读完再用定理continue!!!

注意边是元素,所以是i+m,而且数组也应开成M<<1!!!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,M=;
int T,n,m,hd[M<<],xnt,x[M],y[M],mp[N];
int dfn[M<<],low[M<<],tim,sta[M<<],top,col[M<<],cnt;
bool ins[M<<],flag;
struct Ed{
int nxt,to;Ed(int n=,int t=):nxt(n),to(t) {}
}ed[(M*M)<<];
bool check(int i,int j)
{
int x1=mp[x[i]],y1=mp[y[i]],x2=mp[x[j]],y2=mp[y[j]];
if(x1>y1)swap(x1,y1);
if((x2>x1&&x2<y1&&(y2>y1||y2<x1))||(y2>x1&&y2<y1&&(x2>y1||x2<x1)))return true;
return false;
}
void add(int i,int j)
{
ed[++xnt]=Ed(hd[i],j+m);hd[i]=xnt;
ed[++xnt]=Ed(hd[j],i+m);hd[j]=xnt;
ed[++xnt]=Ed(hd[i+m],j);hd[i+m]=xnt;
ed[++xnt]=Ed(hd[j+m],i);hd[j+m]=xnt;
}
void tarjan(int cr)
{
dfn[cr]=low[cr]=++tim;
sta[++top]=cr;ins[cr]=;
for(int i=hd[cr],v;i;i=ed[i].nxt)
if(!dfn[v=ed[i].to])tarjan(v),low[cr]=min(low[cr],low[v]);
else if(ins[v])low[cr]=min(low[cr],dfn[v]);
if(dfn[cr]==low[cr])
{
cnt++;
while(sta[top]!=cr)col[sta[top]]=cnt,ins[sta[top--]]=;
top--;col[cr]=cnt;ins[cr]=;
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);int z;
for(int i=;i<=m;i++)scanf("%d%d",&x[i],&y[i]);
for(int i=;i<=n;i++)
scanf("%d",&z),mp[z]=i;
if(m>*n-){printf("NO\n");continue;}//先把输入都读完再continue!!!
memset(hd,,sizeof hd);xnt=;
for(int i=;i<m;i++)
for(int j=i+;j<=m;j++)
if(check(i,j))add(i,j);
memset(dfn,,sizeof dfn);tim=;cnt=;
for(int i=;i<=*m;i++)if(!dfn[i])tarjan(i);
flag=;
for(int i=;i<=m;i++)
if(col[i]==col[i+m]){flag=;break;}
if(flag)printf("NO\n");
else printf("YES\n");
}
return ;
}

bzoj 1997 [Hnoi2010]Planar——2-SAT+平面图的一个定理的更多相关文章

  1. BZOJ 1997: [Hnoi2010]Planar( 2sat )

    平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...

  2. Bzoj 1997 [Hnoi2010]Planar题解

    1997: [Hnoi2010]Planar Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2224  Solved: 824[Submit][Stat ...

  3. [BZOJ 1997][HNOI2010]Planar(2-SAT)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...

  4. bzoj 1997: [Hnoi2010]Planar

    #include<cstdio> #include<cstring> #include<iostream> #define M 20005 #define N 20 ...

  5. bzoj 1997: [Hnoi2010]Planar【瞎搞+黑白染色】

    脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠 考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2 ...

  6. 1997: [Hnoi2010]Planar

    1997: [Hnoi2010]Planar 链接 分析: 首先在给定的那个环上考虑进行操作,如果环内有有两条边相交,那么可以把其中的一条放到环的外面去.所以转换为2-sat问题. 像这样,由于1-4 ...

  7. bzoj千题计划231:bzoj1997: [Hnoi2010]Planar

    http://www.lydsy.com/JudgeOnline/problem.php?id=1997 如果两条边在环内相交,那么一定也在环外相交 所以环内相交的两条边,必须一条在环内,一条在环外 ...

  8. [BZOJ1997][Hnoi2010]Planar 2-sat (联通分量) 平面图

    1997: [Hnoi2010]Planar Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2317  Solved: 850[Submit][Stat ...

  9. [bzoj1997][Hnoi2010]Planar(2-sat||括号序列)

    开始填连通分量的大坑了= = 然后平面图有个性质m<=3*n-6..... 由平面图的欧拉定理n-m+r=2(r为平面图的面的个数),在极大平面图的情况可以代入得到m=3*n-6. 网上的证明( ...

随机推荐

  1. 【转载】linux获取mac地址

    #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/soc ...

  2. CSR1010 sdk蓝牙

    转:http://blog.csdn.net/lorain_lynies/article/details/52038640CSR1010 I/O开发须知:关于I/O操作的函数库被定义在头文件<p ...

  3. PHP的垃圾回收机制以及大概实现

    垃圾回收,简称gc.顾名思义,就是废物重利用的意思.再说这个之前先接触一下内存泄露,大概意思就是申请了一块地儿拉了会儿屎,拉完之后不收拾,那么这块地就算糟蹋了,地越用越少,最后一地全是屎.说到底一句, ...

  4. mini2440移植uboot 2014.04(六)

    上一篇博文:<mini2440移植uboot 2014.04(五)> 代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04- ...

  5. ajax01简介

    (Asynchronous JavaScript and XML)Ajax :异步 JavaScript 和 XML,一种允许浏览器和服务器通信进行少量数据交换而无需重新加载整个网页,以实现更新部分网 ...

  6. Eclipse安装SVN客户端

    在Eclipse中安装SVN客户端有个好处,不用兼容其它操作系统都能保持一致的操作.比如再Linux下SVN客户端软件体验相对较差,但是基于命令行的操作却在Linux下无所不能. 一.通过在线安装 地 ...

  7. 内核编译错误解答(elf_i386错误)

    内核编译错误解答(elf_i386错误) 在编译内核过程中遇到的问题及解决方法: 1.root@org:/usr/src/linux# make menuconfig  *** Unable to f ...

  8. C#验证类

    #region 是不是中国电话,格式010-85849685 /**////<summary> /// 是不是中国电话,格式010-85849685 ///</summary> ...

  9. zhly

    5. 百叶002 名字2008 1.新浪   阿里矢量图库账号 15031116087 名字2008 2.acdsee 账号  1173209945  同密码一样 3.zhly   我的名字2016 ...

  10. Linux软件安装(一)

    软件安装方式: 1. rpm方式 该方式软件安装本质与Windows下安装软件方式一致,就是把软件包里面的二进制代码文件复制到系统指定目录(如 C://program files) 优点:软件安装非常 ...