题意:

  有一个环,环上n个点,现在在m个点对之间连一条线,线可以往圆外面绕,也可以往里面绕,问是否必定会相交?

思路:

  根据所给的m条边可知,假设给的是a-b,那么a-b要么得绕环外,要么只能在环内,除非a和b是连续的点才不会影响到任何弧,否则一定会多少影响其他弧的走势。比如样例所举出的 0-2和 1-3,就必须有一条弧选择外环,一个选择内环。

  如何使他们有序不冲突呢?其实这题跟环上的点没多大关系,而且给的点数n也没什么用,而倒是边才重要。我们要做的是让边不冲突。那么肯定是要先选出可能冲突的边来处理,让他们有序而不冲突。

  那么什么时候会冲突?上面所讲的那样就会冲突了,所以我们要将有可能冲突的边全部找出来,那些连边都没有的点是没有用的,连边都没有,谈什么冲突。

  根据冲突边来建图?若有两条边x和y冲突了,那么一条必须在内,另一条相反。则按照2-SAT的模型,选择了x在内,y则必须在外;选择了y在内,则x必须在外。将x放在环外和环内作为两个点,y也同理,将他们连上对应的有向边 “内x->外y”(可以用2*x和2*x+1这种方式代替环内环外的)。这里是以边作为点的。即每条边有两种可能,但是不能同时选,这和2-SAT模型一样。根据这个模型可以建图了。

  求解方式?建图后用tarjan算法求强连通分量,根据边不能同时在环外和环内的规则,如果发现同时在环外/内就判其实无解的。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <vector>
  5. #include <stack>
  6. #include <algorithm>
  7. #define LL long long
  8. #define INF 0x7f7f7f7f
  9. using namespace std;
  10. const int N=+;
  11. vector<int> vect[N*];
  12. int e[N][];
  13. int lowlink[N*], dfn[N*], scc_no[N*], dfn_clock, scc_cnt;
  14. stack<int> stac;
  15.  
  16. void DFS(int x)
  17. {
  18. stac.push(x);
  19. dfn[x]=lowlink[x]=++dfn_clock;
  20. for(int i=; i<vect[x].size(); i++)
  21. {
  22. int t=vect[x][i];
  23. if(!dfn[t])
  24. {
  25. DFS(t);
  26. lowlink[x]=min(lowlink[x],lowlink[t]);
  27. }
  28. else if(!scc_no[t])
  29. lowlink[x]=min(lowlink[x],dfn[t]);
  30. }
  31. if(lowlink[x]==dfn[x])
  32. {
  33. scc_cnt++;
  34. while(true)
  35. {
  36. int t=stac.top();stac.pop();
  37. scc_no[t]=scc_cnt;
  38. if(t==x) break;
  39. }
  40. }
  41. }
  42.  
  43. int cal(int up)
  44. {
  45. scc_cnt=dfn_clock=;
  46. memset(scc_no,,sizeof(scc_no));
  47. memset(lowlink,,sizeof(lowlink));
  48. memset(dfn,,sizeof(dfn));
  49.  
  50. for(int i=; i<up; i++) if(!dfn[i]) DFS(i); //求强连通分量
  51.  
  52. for(int i=; i<up; i+=) if(scc_no[i]==scc_no[i+]) return false; //同在一个强连通分量内
  53.  
  54. return true;
  55. }
  56.  
  57. int main()
  58. {
  59. //freopen("input.txt", "r", stdin);
  60. //仅有1个测试例子
  61. int n, m, a, b;
  62.  
  63. scanf("%d%d",&n,&m);
  64. for(int i=; i<m; i++)
  65. {
  66. scanf("%d%d",&e[i][],&e[i][]);
  67. if(e[i][]>e[i][]) swap(e[i][],e[i][]); //保证小在前
  68. }
  69.  
  70. for(int i=; i<m; i++) //穷举每条弧与其他弧的关系:相当于以点建图
  71. {
  72. a=e[i][];
  73. b=e[i][];
  74. for(int j=i+; j<m; j++)
  75. {
  76. int c=e[j][];
  77. int d=e[j][];
  78. if( a<c && c<b && b<d || c<a && a<d && d<b ) //弧冲突了 a<c<b<d || c<a<d<b
  79. {
  80. vect[i*].push_back(j*+); //只有错开才能无冲突
  81. vect[j*].push_back(i*+);
  82. vect[i*+].push_back(j*);
  83. vect[j*+].push_back(i*);
  84. }
  85. }
  86. }
  87. if(cal(m*)) puts("panda is telling the truth...");
  88. else puts("the evil panda is lying again");
  89. return ;
  90. }

AC代码

POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT,基础)的更多相关文章

  1. POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题)

    POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题) Description liympanda, one of Ikki's friend, likes ...

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

    http://poj.org/problem?id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1000MS   Memory Limit: 13 ...

  3. POJ 3207 Ikki's Story IV - Panda's Trick

    Ikki's Story IV - Panda's Trick Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7296   ...

  4. POJ 3207 Ikki's Story IV - Panda's Trick (2-sat)

    Ikki's Story IV - Panda's Trick Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 6691   ...

  5. poj 3207 Ikki's Story IV - Panda's Trick【2-SAT+tarjan】

    注意到相交的点对一定要一里一外,这样就变成了2-SAT模型 然后我建边的时候石乐志,实际上不需要考虑这个点对的边是正着连还是反着连,因为不管怎么连,能相交的总会相交,所以直接判相交即可 然后tarja ...

  6. POJ 3207 Ikki's Story IV - Panda's Trick 2-sat模板题

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

  7. 【POJ】3207 Ikki's Story IV - Panda's Trick

    http://poj.org/problem?id=3207 题意:一个圆上顺时针依次排列着标号为1-n的点,这些点之间共有m条边相连,每两个点只能在圆内或者圆外连边.问是否存在这些边不相交的方案.( ...

  8. 【POJ3207】Ikki's Story IV - Panda's Trick

    POJ 3207 Ikki's Story IV - Panda's Trick liympanda, one of Ikki's friend, likes playing games with I ...

  9. Ikki's Story IV - Panda's Trick POJ - 3207(水2 - sat 在圈内 还是 在圈外)

    题意: 就是一个圈上有n个点,给出m对个点,这m对个点,每一对都有一条边,合理安排这些边在圈内或圈外,能否不相交 解析: 我手残 我手残 我手残 写一下情况 只能是一个在圈外 一个在圈内 即一个1一个 ...

随机推荐

  1. phpmailer 实现发送邮件

    在注册的时候,常常会用到邮件验证,一直想弄明白这是怎么实现的,记得2年前曾经试过这个问题,没有实现,今天困到不行的时候开始决定搞明白这个,然后,然后就出来了. <?php require(&qu ...

  2. thinkphp操作数据库

    1.实现or操作: $where=array( 'city'=>array('like',array('%'.$_GET['city'].'%')); 'hangye'=>array('l ...

  3. 由底层和逻辑说开去——c++之类与对象的深入剖析

    类是什么,对象是什么,  这两个问题在各个c++书里面都以一种抽象的描述方式,给了我们近乎完美的答案,然后我好像就知道什么是类什么是对象了,但是当扪心自问,类在哪儿,对象在哪儿,成员方法在哪儿,成员变 ...

  4. WPF中禁止WebBrowser控件打开新窗口

    一.针对纯WPF的WebBrowser控件: <summary> Suppress Script Errors In WPF WebBrowser </summary> pub ...

  5. sublime text2 中文乱码的解决办法

    1.安装Sublime Package Control 在Sublime Text 2上用Ctrl+-打开控制台并在里面输入以下代码,Sublime Text 2就会自动安装Package Contr ...

  6. PHP视频教程 > PHP面向对象编程视频教程

    当前位置: 主页 > 编程开发 > PHP视频教程 > PHP面向对象编程视频教程 > kingstone金士顿手机内存卡16G仅65元 1.1.什么是面向对象和类 上传日期: ...

  7. Linux内核树的建立-基于ubuntu系统

    刚看 O'REILLY 写的<LINUX 设备驱动程序>时.作者一再强调在编写驱动程序时必须 建立内核树.先前的内核只需要有一套内核头文件就够了,但因为2.6的内核模块吆喝内核源码树中的目 ...

  8. div蒙版+可移动

    <html> <head>     <title></title>     <script src="jquery-1.8.2.js&q ...

  9. 阿里云Ubuntu服务器安装java环境

    一.下载jdk wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-secureb ...

  10. UINavigationController 总结

    一 . UINavigationBar 1.获取 UINavigationBar 对象: [UINavigationBar appearance] ,可以通过该方法对全部 navigation 进行设 ...