bzoj1997 Planar
思路
首先以那个环为框架,把所有的边连出来。如果有两条边相交,那么就把其中一条放到环外面去。
如图:

\((1,3)\)与\((2,5)相交,\)(1,4)\(与\)(2,5)相交。所以我们把\((2,5)\)这条边放到外面去。
就成了这样

就不会有边相交了。
显然如果两条边在环内相交,那么全部挪到环外也会相交。所以只要是相交的两条边必定是一个在环内,一个在环外。
然后就是2-sat模型了。
坑点。。。
犯了一些很zz的错误。
1.如果边的数量>点的数量乘3-6,即\((m > n \times 3 - 6)\),可以证明必定无解。这个需要判断掉。
2.
没错,这个bug我调了很久233。。。
4.特判的地方要放到全部数据读入之后。。。也调了很久(好zz啊啊啊)
代码
/*
* @Author: wxyww
* @Date: 2019-04-27 19:06:04
* @Last Modified time: 2019-04-27 21:28:17
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int M = 300010;
#define pi pair<int,int>
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node {
int v,nxt;
}e[M];
int head[M],ejs;
void add(int u,int v) {
e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;
}
int n,m,pos[M];
pi tmp[M];
bool pd(int l,int r,int L,int R) {
if(l > r) swap(l,r);if(L > R) swap(L,R);
if((l <= L && r >= R) || (L <= l && R >= r)) return 0;
if(l >= R || L >= r) return 0;
return 1;
}
int tot,vis[M],coljs,sta[M],col[M],top,dfn[M],low[M];
void tarjan(int u) {
dfn[u] = low[u] = ++tot;
sta[++top] = u;vis[u] = 1;
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(vis[v]) low[u] = min(low[u],low[v]);
}
if(low[u] == dfn[u]) {
++coljs;
do {
int x = sta[top--];
col[x] = coljs;
vis[x] = 0;
}while(sta[top + 1] != u);
}
}
int main() {
int T = read();
while(T--) {
memset(head,0,sizeof(head));
ejs = 0;
memset(pos,0,sizeof(pos));
coljs = 0;memset(col,0,sizeof(col));
memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
tot = 0;top = 0;
n = read(),m = read();
for(int i = 1;i <= m;++i) tmp[i].first = read(),tmp[i].second = read();
for(int i = 1;i <= n;++i) pos[read()] = i;
if(m > 3 * n - 6) {
puts("NO");continue;
}
for(int i = 1;i <= m;++i)
for(int j = i + 1;j <= m;++j)
if(pd(pos[tmp[i].first],pos[tmp[i].second],pos[tmp[j].first],pos[tmp[j].second]))
add(i,j + m),add(i + m,j),add(j,i + m),add(j + m,i);
for(int i = 1;i <= m + m;++i) if(!dfn[i]) tarjan(i);
int bz = 0;
for(int i = 1;i <= m;++i) if(col[i] == col[i + m]) bz = 1;
if(bz) puts("NO");else puts("YES");
}
return 0;
}
bzoj1997 Planar的更多相关文章
- 【BZOJ1997】Planar(2-sat)
[BZOJ1997]Planar(2-sat) 题面 BZOJ 题解 很久没做过\(2-sat\)了 今天一见,很果断的就来切 这题不难呀 但是有个玄学问题: 平面图的性质:边数\(m\)的最大值为\ ...
- 【BZOJ1997】[Hnoi2010]Planar 2-SAT
[BZOJ1997][Hnoi2010]Planar Description Input Output Sample Input 2 6 9 1 4 1 5 1 6 2 4 2 5 2 6 3 4 3 ...
- [bzoj1997][Hnoi2010]Planar(2-sat||括号序列)
开始填连通分量的大坑了= = 然后平面图有个性质m<=3*n-6..... 由平面图的欧拉定理n-m+r=2(r为平面图的面的个数),在极大平面图的情况可以代入得到m=3*n-6. 网上的证明( ...
- bzoj千题计划231:bzoj1997: [Hnoi2010]Planar
http://www.lydsy.com/JudgeOnline/problem.php?id=1997 如果两条边在环内相交,那么一定也在环外相交 所以环内相交的两条边,必须一条在环内,一条在环外 ...
- BZOJ1997 [Hnoi2010]Planar 【2-sat】
题目链接 BZOJ1997 题解 显然相交的两条边不能同时在圆的一侧,\(2-sat\)判一下就好了 但这样边数是\(O(m^2)\)的,无法通过此题 但是\(n\)很小,平面图 边数上界为\(3n ...
- [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,如果不满足这条件肯定不是平面图,直接退出. 然后构成哈密顿回路的边直接忽略. 把哈密顿回路当成一个圆, 如果俩条边交叉(用心去感受),只能一条边 ...
- BZOJ1997 [Hnoi2010]Planar (2-sat)
题意:给你一个哈密顿图,判断是不是平面图 思路:先找出哈密顿图来.哈密顿回路可以看成一个环,把边集划分成两个集合,一个在环内,一个在外.如果有两条相交边在环内,则一定不是平面图,所以默认两条相交边,转 ...
- BZOJ1997:[HNOI2010]PLANAR——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1997 https://www.luogu.org/problemnew/show/P3209 若能 ...
随机推荐
- Java运行时数据区概述
Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,如图所示: 程序计数器 程序计数器是一块比较小的内存空间,可以看作是当前线程所执行的字节 ...
- python的学习笔记01_5文件操作
一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...
- arcgis api 3.x for js 入门开发系列十八风向流动图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- Spark RPC框架源码分析(二)RPC运行时序
前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...
- Linux学习历程——Centos 7 ls命令
一.命令介绍 ls命令用于显示目录中的信息. ----------------------------------------------------------------------------- ...
- C# 得到EXCEL表格中的有效行数和列数
每种方法中上面的是Excel的行数,下面的是Excel的列数.方法七:经过加工修改已经可以读出来的是有效数据行 using Excel = Microsoft.Office.Interop.Excel ...
- maven项目更换本地仓库
由于电脑重装系统更换原来maven项目的本地仓库 以前的仓库位置如图 需要更换的仓库位置 更换步骤如下: 更换后:
- 记录Javascript集合操作
function Set() { var items = {}; /** * 添加元素 * @param {[type]} value [description] */ this.add = func ...
- cordova插件汇总
1.获取当前应用的版本号 cordova plugin add cordova-plugin-app-version 2.获取网络连接信息 cordova plugin add cordova-plu ...
- OSI模型网络七层协议
物理层 物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础.物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境. 1.1媒体和互连设备 物理层的媒体包括架空明线. ...