传送门

题意:$T$组数据,每组数据给出一个$N$个点,$M$条边,并存在一个$N$元环的图,试判断其是否为一个可平面图(如果存在一种画法,使得该图与给出的图同构且边除了在顶点处以外互相不相交,则称其为可平面图)$T \leq 100 , N \leq 200 , M \leq 10000$


关于平面图的性质可以参照这一个PPT

我们需要用到平面图的一个推论:在极大平面图(不能再加边的平面图)上,$M = 3 \times N - 6$(PPT里面有证明)

所以对于$M > 3 \times N - 6$的情况可以直接判定为NO,这样我们需要处理的问题的边数变为了$O(N)$级别。

接下来我们考虑$N$元环的作用。一个$N$元环将整个图分成了两个部分,一个在环内,一个在环外,而环内和环外连的边不能在非顶点处相交。这个问题可以通过并查集来实现,将一条边看做两个点(一个表示不与当前边排斥,一个表示与当前边排斥),对于互相排斥的边在并查集上合并,最后考虑是否存在一条边的两个点在一个集合内即可。

 #include<bits/stdc++.h>
 using namespace std;

 inline int read(){
     ;
     ;
     char c = getchar();
     while(!isdigit(c)){
         if(c == '-')
             f = ;
         c = getchar();
     }
     while(isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return f ? -a : a;
 }

 struct Edge{
     int start , end;
 }Ed[];
 map < int , int > lsh;
 ];

 bool cmp(Edge a , Edge b){
     return a.start < b.start;
 }

 inline void init(){
      ; i <= M <<  ; i++)
         fa[i] = i;
 }

 int find(int x){
     return fa[x] == x ? x : (fa[x] = find(fa[x]));
 }

 int main(){
 #ifdef LG
     freopen("3209.in" , "r" , stdin);
     freopen("3209.out" , "w" , stdout);
 #endif
     for(int T = read() ; T ; T--){
         N = read();
         M = read();
          ; i <= M ; i++){
             Ed[i].start = read();
             Ed[i].end = read();
         }
         lsh.clear();
          ; i <= N ; i++)
             lsh[read()] = i;
          * N - ){
             cout << "NO" << endl;
             continue;
         }
          ; i <= M ; i++){
             Ed[i].start = lsh[Ed[i].start];
             Ed[i].end = lsh[Ed[i].end];
             if(Ed[i].start > Ed[i].end)
                 swap(Ed[i].start , Ed[i].end);
         }
         init();
         sort(Ed +  , Ed + M +  , cmp);
         ;
          ; f && i <= M ; i++){
              ; f && j ; j--)
                 if(Ed[j].end > Ed[i].start && Ed[j].end < Ed[i].end && Ed[j].start < Ed[i].start){
                     fa[find(j)] = find(i + M);
                     fa[find(i)] = find(j + M);
                     if(find(i) == find(i + M) || find(j) == find(j + M))
                         f = ;
                 }
         }
         cout << (f ? "YES" : "NO") << endl;
     }
     ;
 }

Luogu3209 HNOI2010 平面图判定 平面图、并查集的更多相关文章

  1. 【BZOJ1998】[HNOI2010]物品调度(并查集,模拟)

    [BZOJ1998][HNOI2010]物品调度(并查集,模拟) 题面 BZOJ,为啥这题都是权限题啊? 洛谷 题解 先不管\(0\)位置是个空,把它也看成一个箱子.那么最终的答案显然和置换循环节的个 ...

  2. 【bzoj4423】[AMPPZ2013]Bytehattan(平面图转对偶图+并查集)

    题目传送门:bzoj4423 如果是普通的删边判连通性,我们可以很显然的想到把操作离线下来,倒着加边.然而,这题强 制 在 线. 虽然如此,但是题目所给的图是个平面图.那么我们把它转成对偶图试试看? ...

  3. BZOJ 4423: [AMPPZ2013]Bytehattan 平面图转对偶图 + 并查集

    Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一 ...

  4. hihoCoder 树结构判定(并查集)

    思路:树满足两个条件: 1.顶点数等于边数加一 2.所有的顶点在一个联通块 那么直接dfs或者并查集就可以了. AC代码 #include <stdio.h> #include<st ...

  5. NYOJ 129 树的判定 (并查集)

    题目链接 描述 A tree is a well-known data structure that is either empty (null, void, nothing) or is a set ...

  6. BZOJ1997 平面图判定 平面图性质 2-sat

    相交的两条边不能在同一侧,用2-sat即可. 平面图点数-边数关系 \(E\le 3V-6\) 写这篇文章我只是想说明,知乎一小时,题解一分钟. lb Zhihu, gos langar Qarwet ...

  7. [HIHO1322]树结构判定(并查集)

    题目链接:http://hihocoder.com/problemset/problem/1322 给一个图,判断这个图是不是一棵树. 判定的方法:首先是连通图,其次所有点的入度都小于等于1. /* ...

  8. BZOJ1997 HNOI2010 平面图判定 planar (并查集判二分图)

    题意 判断一个存在哈密顿回路的图是否是平面图. n≤200,m≤10000n\le200,m\le10000n≤200,m≤10000 题解 如果一定存在一个环,那么连的边要么在环里面要么在外面.那么 ...

  9. Luogu P3209 [HNOI2010]平面图判定(2-SAT)

    P3209 [HNOI2010]平面图判定 题意 题目描述 若能将无向图\(G=(V,E)\)画在平面上使得任意两条无重合顶点的边不相交,则称\(G\)是平面图.判定一个图是否为平面图的问题是图论中的 ...

随机推荐

  1. MSCRM中报表开发二:创建基于FetchXML报表

    1. 获取FetchXML.因为FetchXML难以撰写,所以我们一般都是使用高级查找来生成FetchXML或者通过其他工具来生成.我这里在商机界面通过高级查找制作了一个新的视图,名称为 商机查询,  ...

  2. BI怎么选?重点看这10个技术指标

    2016年,商业智能市场火热,不管是投资圈还是IT圈,都在广泛关注着大数据和商业智能.宣传广告媒体报道见多了,不知道大家对BI选型的技术标准有谱了没.笔者对Gartner的BI魔力象限考评的15个关键 ...

  3. 排错-安装SQl 2008“为SQL Server代理服务提供的凭据无效的解决方法

    安装SQl 2008“为SQL Server代理服务提供的凭据无效的解决方法 by:授客 QQ:1033553122 在Windows Server 2008安装SQL Server 2008出现的问 ...

  4. 安卓开发之ScrollView

    当界面不足以将所有的内容显示出来的时候便导致下面的部分内容无法显示出来 所有加上ScrollView 来讲要显示的内容放入之中便可以实现上下滚动界面内容 但是当要显示多个控件的时候会出错  原因是Sc ...

  5. python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)

    python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...

  6. python第九十六天 ---Django(1)

    django 模块 一  安装: pip3 install django 或 python -m pip install django 二  添加环境变量 相关命令: #cmd 下 django-ad ...

  7. 在ASP.NET Core中使用多环境

    原文地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.1#star ...

  8. SQLServer数据集合的交、并、差集运算

    SQLServer2005通过intersect,union,except和三个关键字对应交.并.差三种集合运算. 他们的对应关系可以参考下面图示 相关测试实例如下: use tempdb go if ...

  9. pandas的resample重采样

    Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法. 降采样:高频数据到低频数据 升采样:低频数据到高频数据 主要函数:r ...

  10. [MapReduce_add_3] MapReduce 通过分区解决数据倾斜

    0. 说明 数据倾斜及解决方法的介绍与代码实现 1. 介绍 [1.1 数据倾斜的含义] 大量数据发送到同一个节点进行处理,造成此节点繁忙甚至瘫痪,而其他节点资源空闲 [1.2 解决数据倾斜的方式] 重 ...