POJ 3207 Ikki’s Story IV - Panda’s Trick

liympanda, one of Ikki’s friend, likes playing games with Ikki. Today after minesweeping with Ikki and winning so many times, he is tired of such easy games and wants to play another game with Ikki.

liympanda has a magic circle and he puts it on a plane, there are n points on its boundary in circular border: 0, 1, 2, …, n − 1. Evil panda claims that he is connecting m pairs of points. To connect two points, liympanda either places the link entirely inside the circle or entirely outside the circle. Now liympanda tells Ikki no two links touch inside/outside the circle, except on the boundary. He wants Ikki to figure out whether this is possible…

Despaired at the minesweeping game just played, Ikki is totally at a loss, so he decides to write a program to help him.

Input

The input contains exactly one test case.

In the test case there will be a line consisting of of two integers: n and m (n ≤ 1,000, m ≤ 500). The following m lines each contain two integers ai and bi, which denote the endpoints of the ith wire. Every point will have at most one link.

Output

Output a line, either “panda is telling the truth…” or “the evil panda is lying again”.

Sample Input

4 2
0 1
3 2

Sample Output

panda is telling the truth…


题目大意

在一个圆上有n个点(依从从0~n-1编号)。再给定m组点,表示这两个点要相互连接,连接的方式要么在圈外,要么在圈内。询问,能否使得任意两个连线都没有交点(端点除外)?

解决

如果存在交点,是什么情况?

在圆内如果有交点,例如,(0,1)(2,4)的两条连线。在图上很显然的就存在交点。观察一下,那么就是两组连线的点依次出现。
即:Link[i].a < Link[j].a < Link[i].b < Link[j].b(a始终比b小)
那么此时一定存在交点

再来看在圆外的情况

原谅我图画得奇丑无比(然而我已经尽力了)

我们可以发现,如果在圆外存在交点,那么在园内必定存在交点。

所以,式子和上面一模一样。

知道了这个边是怎么回事。题目就转换为了:对于任意两组边,如果存在相交的关系,那么他们不能够同时存在于一侧(只能一内一外)。

那么它就转换为了一个2-sat问题,每条边要么在内,要么在外。
如果2-sat问题不熟可以做一下【POI2001和平委员会】理解一下
(http://blog.csdn.net/qq_30974369/article/details/73927421)

接下来不难了,因为只需要判断可行性,所以这类2-sat就非常容易解决,连完了边,用Tarjan缩点(因为在一个强连通分量中的点要么都选,要么都不选),依次判断即可。(具体实现看看代码)

补充一下一般2-sat问题的做法:
1.根据题目含义建边
2.使用Tarjan进行缩点
3.检查每一组是否存在矛盾(某个点的选择A和选择B在同一个相连通分量里面)
4.对缩出来的点进行拓扑排序,依次染色即可(一定存在解)
如果不能够理解为什么存在解,就到打开上面的链接,那个Blog里面贴了一个大佬的2-sat详解

这道题目做完了可以接着做下一道【POJ3683】
http://blog.csdn.net/qq_30974369/article/details/74025251

/*POJ 3207 Ikki's Story IV - Panda's Trick 题目大意:
n个点连成一圈,指定m对点之间要有连线
可以连在圈外也可以连在圈内
问能否使所有的连线不相交思路:
这题的点只是一个媒介
对于每一条边而言,有两种选择:在圈内/在圈外
因此是一道比较显然的2-sat问题
易证明:若两条边在圈内相交则必定在圈外相交
那么,只要通过点的位置来考虑边是否相交
用2-sat即可求解 */#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAX=100000;
struct Node
{int v,next;
}e[MAX];
int h[MAX],cnt=0;
int n,m,dfn[MAX],low[MAX],tim=0;
int Linkx[MAX],Linky[MAX];
int S[MAX],top=0;
int G[MAX],group=0;
bool vis[MAX];
inline void Add(int u,int v)
{e[cnt]=(Node){v,h[u]};h[u]=cnt++;
}
inline void Link();//连边
inline void Tarjan(int u);//缩点
int main()
{memset(h,-1,sizeof(h));cin>>n>>m;for(int i=1;i<=m;++i){cin>>Linkx[i]>>Linky[i];//储存每条边的两个端点 Linkx[i]++;Linky[i]++;//因为是从0开始的,都加1 if(Linkx[i]>Linky[i])swap(Linkx[i],Linky[i]);//x中存编号较小的点 }Link(); //连边 for(int i=1;i<=2*m;++i)//缩点 if(!dfn[i])Tarjan(i);for(int i=1;i<=m;i++){if(G[i]==G[i+m]){cout<<"the evil panda is lying again"<<endl;return 0;}}cout<<"panda is telling the truth..."<<endl;return 0;
}
void Link()//通过点的关系把所有的边的关系找出,转化为2-sat
{for(int i=1;i<=m;++i)for(int j=i+1;j<=m;++j){if(((Linkx[i]<=Linkx[j])&&(Linkx[j]<=Linky[i])&&(Linky[i]<=Linky[j]))||((Linkx[i]>=Linkx[j])&&(Linkx[i]<=Linky[j])&&(Linky[j]<=Linky[i]))){//出现交叉情况不能够同时选择 Add(i,j+m);//i内j外 Add(j,i+m);//反向边 Add(i+m,j);//i外j内Add(j+m,i);//反向边                // i     表示第i条边连在内侧// i+m   表示第i条边连在外侧 }}
}
void Tarjan(int u)//缩点
{dfn[u]=low[u]=++tim;S[++top]=u;vis[u]=true;int v;for(int i=h[u];i!=-1;i=e[i].next){v=e[i].v;if(!dfn[v]){Tarjan(v);low[u]=min(low[u],low[v]);}elseif(vis[v])low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){++group;do{v=S[top--];vis[v]=false;G[v]=group;}while(v!=u&&top);}
}
/*
写在AC后面:
这题我WA了很久,并不知道自己哪里错了
只到最后,忽然,发现,自己,
在,连边的,时候,尽然,没有,加{},把Add()打包。
我,真是,智障,了。。。
*/

【POJ3207】Ikki's Story IV - Panda's Trick相关推荐

  1. poj 3207 Ikki's Story IV - Panda's Trick(2-SAT)

    题目链接:http://poj.org/problem?id=3207 思路分析:该问题给出N个点,并给出M条连接这些点的线,需要判断是否这些线不会相交: (1)假设两条线A的端点按照圆圈的顺时针方向 ...

  2. POJ 3207 Ikki's Story IV - Panda's Trick (POJ 六道2-SAT之一)

    题意:平面上,一个圆,圆的边上按顺时针放着n个点.现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接.给你的信息中,每个点最多只会连接的一条边.问能不能连接这m条边,使这些 ...

  3. pku 3207 Ikki's Story IV - Panda's Trick 2-sat判定是否存在可行解

    http://poj.org/problem?id=3207 题意: 一个圆盘的边沿上有n个点, 下标从0开始, 有m条线连接2m个互不相同的点, 线可以在圆盘内部,也可以在圆盘外部, 要求任意两条线 ...

  4. 【BZOJ3512】DZY Loves Math IV(杜教筛)

    [BZOJ3512]DZY Loves Math IV(杜教筛) https://www.cnblogs.com/cjyyb/p/10165338.html

  5. 【BZOJ3512】DZY Loves Math IV

    题目大意 给出 n , m n,m n,m,求 ∑ i = 1 n ∑ j = 1 m ϕ ( i j ) \sum\limits_{i=1}^n\sum\limits_{j=1}^m\phi(ij) ...

  6. 【BZOJ3512】 DZY Loves Math IV

    题意:(第n+1次)略 首先转换:Ans(n,m)=∑i=1n∑j=1mφ(i⋅j)设s(n,m)=∑i=1mφ(n⋅i)那么Ans(n,m)=∑i=1ns(i,m)每次从1到n枚举i,然后考虑:s( ...

  7. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. 【HDU】5267 pog loves szh IV【动态点分治】

    传送门:[HDU]5267 pog loves szh IV 题目分析:首先我们用树分治,对每一个分治重心,以此为根的子树,建立一棵线段树.可以发现总节点数只有$O(NlogN)$,因为每一层都是$N ...

  10. 【故障处理】队列等待之enq IV - contention案例

    [故障处理]队列等待之enq IV -  contention案例 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

最新文章

  1. 源码解析 React Hook 构建过程
  2. golang中的二维数组和二维切片
  3. 生鲜配送小程序源码_生鲜配送小程序开发
  4. ZedGraph怎样在生成曲线时随机生成不一样的颜色
  5. python爬虫入门(六) Scrapy框架之原理介绍
  6. Understanding Clouds from Satellite Images语义分割比赛中train_test_split与stratify配合使用
  7. php正则过滤html标签_空格_换行符的代码,PHP 正则过滤 html 标签、空格、换行符的代码 (文章格式化)...
  8. Spring 实践 -拾遗
  9. 跨Rollup转账应用HopProtocol将于4月份上线主网
  10. python3 beautifulsoup_Python3中BeautifulSoup的使用方法
  11. 微信小程序累计独立访客(UV)不低于 1000 是什么意思
  12. nodejs操作Excel
  13. html如何在字段前面空格怎么打,css特殊空格符号 nbsp前面那个怎么打
  14. ps去水印教程_Ps去水印教程:简单三步教新手学习去狮子图像上的水印,多余的文...
  15. electron坑: 缩小放大快捷键
  16. 用深度学习做个艺术画家 ——模仿实现PRISMA
  17. 论文分享 Deep Distance Transform for Tubular Structure Segmentation in CT Scans
  18. 马斯克将Twitter算法开源、谷歌向CNCF捐赠Istio、甲骨文修复Java年度加密漏洞 | 开源月报 Vol. 05...
  19. Android加载长图,仿微博长图滚动查看
  20. jquery中的事件

热门文章

  1. The Feynman Technique The Best Way to Learn Anything理查德•弗曼学习法
  2. 运放的增益带宽积、单位增益带宽
  3. 人体性神经系统分布图,女性神经分布图高清
  4. php手机注册和微信登录统一,微信登录和公众号授权登录开发逻辑详解
  5. 《山海经》异兽75种,附图
  6. java 短信验证码 安全_有关java短信验证码的小知识
  7. 蝶式套利(butterfly spread)
  8. freeSSL申请证书加阿里云域名解析加nginx配置
  9. python 中文分析句子成分_英语长难句看不懂,句子成分不会分析?一文轻松搞定...
  10. spss可以关键词词频分析吗_有什么自动分词做词频分析的工具?