1997: [Hnoi2010]Planar

链接

分析:

  首先在给定的那个环上考虑进行操作,如果环内有有两条边相交,那么可以把其中的一条放到环的外面去。所以转换为2-sat问题。

像这样,由于1-4和2-3在环内相交了,所以可以把1-4放到环外,就变成了下图。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
struct Edge{ int to, nxt; } e[];
int head[N], dfn[N], low[N], bel[N], sk[N], c[N], pos[N], top, Index, tot, En;
bool vis[N];
pair<int,int> g[]; inline void add_edge(int u,int v) {
++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En;
}
void tarjan(int u) {
low[u] = dfn[u] = ++Index;
sk[++top] = u; vis[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
}
if (vis[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++tot;
do {
vis[sk[top]] = ;
bel[sk[top]] = tot;
top --;
} while (sk[top + ] != u);
}
}
bool judge(int a,int b,int c,int d) {
if (b > c && b < d && a < c) return ;
if (a > c && a < d && b > d) return ;
return ;
}
void solve() {
int n = read(), m = read(), cnt = ;
for (int i = ; i <= m; ++i)
g[i].first = read(), g[i].second = read();
for (int i = ; i <= n; ++i) c[i] = read();
if (m > * n - ) { puts("NO"); return ; }
for (int i = ; i <= n; ++i) pos[c[i]] = i;
for (int i = ; i <= m; ++i) {
g[i].first = pos[g[i].first], g[i].second = pos[g[i].second];
if (g[i].first > g[i].second) swap(g[i].first, g[i].second);
if (g[i].second - g[i].first == || (g[i].first == && g[i].second == n)) continue;
g[++cnt] = g[i];
}
m = cnt;
for (int i = ; i <= m; ++i)
for (int j = i + ; j <= m; ++j) {
if (judge(g[i].first, g[i].second, g[j].first, g[j].second)) {
add_edge(i, j + m);
add_edge(i + m, j);
add_edge(j, i + m);
add_edge(j + m, i);
}
}
for (int i = ; i <= m + m; ++i) if (!dfn[i]) tarjan(i);
bool flag = ;
for (int i = ; i <= m; ++i) if (bel[i] == bel[i + m]) flag = ;
puts(flag ? "YES" : "NO");
top = Index = En = tot = ;
for (int i = ; i <= m + m; ++i)
head[i] = dfn[i] = low[i] = bel[i] = ;
}
int main() {
for (int T = read(); T--; ) solve();
return ;
}

1997: [Hnoi2010]Planar的更多相关文章

  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——2-SAT+平面图的一个定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997 平面图的一个定理:若边数大于(3*点数-6),则该图不是平面图. 然后就可以2-SAT ...

  5. bzoj 1997: [Hnoi2010]Planar

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

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

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

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

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

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

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

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

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

随机推荐

  1. The Master of Science degree in Computer Scienc

    Computer Science MS Degree MS Degree or Depth       45.00 Hours Required   http://scpd.stanford.edu/ ...

  2. Provisional headers are shown

    问题: Chrome请求出现"Provisional headers are shown": 原因: 这种一般是由于浏览器端的插件或客户端的软件对请求进行了拦截:我们出现的情况,是 ...

  3. Cloudstack

    1.cloudstack介绍 一个开源具有高可用性及扩展性的云计算平台,Cloudstack是一个开源的云操作系统: cloudstack支持管理大部分主流的hypervisors,如:VMware, ...

  4. Hadoop HBase概念学习系列之列、列簇(十二)

    列在列簇中依照字典排序.例如,列簇是基础信息或公司域名或水果类.列是基础信息:面貌.基础信息:年龄.公司域名:org.公司域名:edu.水果类:苹果.水果类:香蕉.      列 = 列簇:列修饰符 ...

  5. Array对象常用方法

    不改变原数组: 1.concat()  连接两个或多个数组 不改变原数组 返回被连接数组的一个副本 2.join()  把数组中所有元素放入一个字符串 不改变原数组 返回字符串 3.slice()   ...

  6. exits, in, left join性能比较

    exits  in left join性能比较 ,笔者使用的是MYSQL数据库,这三个关键字方法在其他的关系数据库里也是大同小异,如果各种有兴趣,自行比较. 我这里有一个249_account 表,总 ...

  7. socket.io+angular.js+express.js做个聊天应用(二)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/www19940501a/article/details/27585321 接着上一篇 我用的开发工具 ...

  8. 理解JavaScript继承(三)

    理解JavaScript继承(三) 通过把父对象的属性,全部拷贝给子对象,也能实现继承. 7.浅拷贝 function extendCopy(p) { var o = {}; for (var pro ...

  9. ZooKeeper分布式专题与Dubbo微服务入门

    第1章 分布式系统概念与ZooKeeper简介对分布式系统以及ZooKeeper进行简介,使得大家对其有大致的了解1-1 zookeeper简介1-2 什么是分布式系统1-3 分布式系统的瓶颈以及zk ...

  10. linux shell基本知识 sleep命令

    在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小时) sleep 睡眠1秒 sleep 1s 睡眠1秒 sleep 1m 睡眠1分 sleep 1h 睡眠1小时