bzoj 1997 [Hnoi2010]Planar——2-SAT+平面图的一个定理
题目: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+平面图的一个定理的更多相关文章
- BZOJ 1997: [Hnoi2010]Planar( 2sat )
平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...
- Bzoj 1997 [Hnoi2010]Planar题解
1997: [Hnoi2010]Planar Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2224 Solved: 824[Submit][Stat ...
- [BZOJ 1997][HNOI2010]Planar(2-SAT)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...
- bzoj 1997: [Hnoi2010]Planar
#include<cstdio> #include<cstring> #include<iostream> #define M 20005 #define N 20 ...
- bzoj 1997: [Hnoi2010]Planar【瞎搞+黑白染色】
脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠 考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2 ...
- 1997: [Hnoi2010]Planar
1997: [Hnoi2010]Planar 链接 分析: 首先在给定的那个环上考虑进行操作,如果环内有有两条边相交,那么可以把其中的一条放到环的外面去.所以转换为2-sat问题. 像这样,由于1-4 ...
- bzoj千题计划231:bzoj1997: [Hnoi2010]Planar
http://www.lydsy.com/JudgeOnline/problem.php?id=1997 如果两条边在环内相交,那么一定也在环外相交 所以环内相交的两条边,必须一条在环内,一条在环外 ...
- [BZOJ1997][Hnoi2010]Planar 2-sat (联通分量) 平面图
1997: [Hnoi2010]Planar Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2317 Solved: 850[Submit][Stat ...
- [bzoj1997][Hnoi2010]Planar(2-sat||括号序列)
开始填连通分量的大坑了= = 然后平面图有个性质m<=3*n-6..... 由平面图的欧拉定理n-m+r=2(r为平面图的面的个数),在极大平面图的情况可以代入得到m=3*n-6. 网上的证明( ...
随机推荐
- 封装一个既能遍历数组又能遍历对象的的forEach函数
function newforEach(obj,fn) { var key; if(obj instanceof Array){ obj.forEach(function(item,index){ f ...
- 树 List Leaves 【用数组模拟了树状结构建树+搜索叶子节点+按照特殊规律输出每个叶子节点】
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...
- POI实现数据的导入
1.POI技术的概述? POI技术:apache POI是可以对微软office文档进行读和写的工具. l HSSF:操作97格式的excel,扩展名:.xls 纯二进制,最大行数65535. l X ...
- JSP的动态Include的静态Include
1. 静态导入示例 先总结: 1:静态include是把被引入的文件拼接到本页面中,再做为一个整体来编译,返回结果给客户端. 动态include是分别编译本页面和被引入的页面,再把结果合成一个html ...
- OpenStack for NFV applications: enabling Single Root I/O virtualization and PCI-Passthrough
http://superuser.openstack.org/articles/openstack-for-nfv-applications-enabling-single-root-i-o-virt ...
- Android 6.0运行时权限第三方库的使用-----RxPermissions
运行时权限的讲解在前一篇博客已经算是说的比较清楚了,这里就不说了,如果对6.0这个新特性不是很了解的朋友建议先看看(地址:http://blog.csdn.net/qq_33923079/articl ...
- Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID
query取得iframe中元素的几种方法 在iframe子页面获取父页面元素代码如下: $('#objId', parent.document);// 搞定... 在父页面 获取iframe子页面的 ...
- js的事件处理与闭包:
var i = 0; for(i=0;i<5;i++){ (function(i){ setTimeout(function(){alert(i)},3000); })(i) } // 上面打印 ...
- 查询优化 | MySQL慢查询优化
Explain查询:rows,定位性能瓶颈. 只需要一行数据时,使用LIMIT1. 在搜索字段上建立索引. 使用ENUM而非VARCHAR. 选择区分度高的列作为索引. 采用扩展索引,而不是新建索引 ...
- java多线程学习二
声明:本篇博客是本人为了自己学习保存的心得,其内容主要是从大神——五月的仓颉的博客中学习而来,在此多谢大神五月的仓颉的分享,敬礼!如有疑问请联系博主,谢谢! 本章主要记录并讲述线程在项目中常用的方法: ...