一开始题意没读懂 = =

题意:比如说对于表盘上a到b、c到d都要连边,这两个边不能交叉。这两个边要么都在圆内要么都在圆外,而且可以是曲线= =

比如这种情况:(Reference:http://blog.csdn.net/l04205613/article/details/6668318)

(左边情况看似是合法的,但是一个边在圆内一个在圆外,形成矛盾了)

这回只需判断是否可行不用输出方案,这样就简单多了

STEP:构图,矛盾的地方连边->tarjan求scc->判断是否a和not a在同一分量内

  1. #include "iostream"
  2. #include "cstring"
  3. #include "stack"
  4. using namespace std;
  5. #define maxn 2010
  6.  
  7. int G[maxn][maxn],dx[maxn],dy[maxn];
  8. int pre[maxn],lowlink[maxn],sccno[maxn];
  9. int dfs_clock,scc_cnt,N,M;
  10. stack<int> St;
  11.  
  12. void tarjan(int u)
  13. {
  14. pre[u]=lowlink[u]=++dfs_clock;
  15. St.push(u);
  16. for (int i=;i<=G[u][];i++)
  17. {
  18. int v=G[u][i];
  19. if (!pre[v])
  20. {
  21. tarjan(v);
  22. lowlink[u]=min(lowlink[u],lowlink[v]);
  23. }
  24. else if (!sccno[v])
  25. {
  26. lowlink[u]=min(lowlink[u],pre[v]);
  27. }
  28. }
  29. if (lowlink[u]==pre[u])
  30. {
  31. scc_cnt++;
  32. for (;;)
  33. {
  34. int x=St.top();
  35. St.pop();
  36. sccno[x]=scc_cnt;
  37. if (x==u) break;
  38. }
  39. }
  40. }
  41.  
  42. void find_scc(int n)
  43. {
  44. dfs_clock=scc_cnt=;
  45. memset(sccno,,sizeof(sccno));
  46. memset(pre,,sizeof(pre));
  47. for (int i=;i<=n;i++)
  48. if (!pre[i])
  49. tarjan(i);
  50. }
  51.  
  52. void add_edge(int x,int y)
  53. {
  54. G[x][]++;
  55. G[x][G[x][]]=y;
  56. }
  57.  
  58. int main()
  59. {
  60. cin>>N>>M;
  61. for (int i=;i<=M;i++)
  62. cin>>dx[i]>>dy[i];
  63.  
  64. //1->N:dx[i]->dy[i]走圆内
  65. //N+1->2*N:dx[i]->dy[i]走圆外
  66. for (int i=;i<=N;i++)
  67. {
  68. for (int j=i+;j<=N;j++)
  69. {
  70. if ((dx[j]<dx[i])&&(dx[i]<dy[j])&&(dy[j]<dy[i]))
  71. {
  72. add_edge(i,j+N);
  73. add_edge(j+N,i);
  74. add_edge(j,i+N);
  75. add_edge(i+N,j);
  76. }
  77. if ((dx[i]<dx[j])&&(dx[j]<dy[i])&&(dy[i]<dy[j]))
  78. {
  79. add_edge(i,j+N);
  80. add_edge(j+N,i);
  81. add_edge(j,i+N);
  82. add_edge(i+N,j);
  83. }
  84. }
  85. }
  86.  
  87. find_scc(*N);
  88.  
  89. for (int i=;i<=N;i++)
  90. {
  91. if (sccno[i]==sccno[i+N])
  92. {
  93. cout<<"the evil panda is lying again"<<endl;
  94. return ;
  95. }
  96. }
  97. cout<<"panda is telling the truth..."<<endl;
  98. return ;
  99.  
  100. }

------------------------------------------------------------------------------------------------

注意:对于2-SAT问题构图的时候有些题还要纠结一下是连单向边(如poj3678)还是双向边(如本题),

reference:http://blog.csdn.net/u011026968/article/details/10823853

本题中,我们以第二个判断条件if ((dx[i]<dx[j])&&(dx[j]<dy[i])&&(dy[i]<dy[j]))为例:

若j在圆内,那么i一定在圆外

若j在圆外,那么i一定在圆内

若i在圆内,那么j一定在圆外

若i在圆外,那么j一定在圆内

注意蓝色部分就是双向边了

------------------------------------

而poj 3683题中:

我们以构图时的第一个判断条件if (min(S[i]+D[i],S[j]+D[j])>max(S[i],S[j]))为例,

若i在前段举行,那么j一定在后半段举行

若j在后半段举行,那么i不一定要在前半段举行

若j在前段举行,那么i一定在后半段举行

若i在后半段举行,那么j不一定要在前半段举行

注意红色部分:因为不确定(本判断条件中并没有讨论后半段的时间),所以不能双向边

poj3207 2-SAT入门的更多相关文章

  1. Quartz 入门详解

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  2. Yii2框架RESTful API教程(一) - 快速入门

    前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ...

  3. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  4. angular入门

    angular入门 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  5. 161103、Spring Boot 入门

    Spring Boot 入门 spring Boot是Spring社区较新的一个项目.该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验 ...

  6. Spring入门学习(一)

    SpringMVC基础平台补充(2016.03.03) 如果想要开发SpringMVC,那么前期依次安装好:JDK(jdk-8u74-windows-x64,安装后配置环境变量JAVA_HOME和CL ...

  7. Redis入门教程:特性及数据类型的操作

    虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...

  8. 史上最全!信息安全入门指南<转>

    以下所列出的链接均为在线文档,有志于信息安全的爱好者可由此作为入门指南. 背景知识 常规知识 Sun认证-Solaris 9&10安全管理员学习指南 PicoCTF资料 应用软件安全 OWAS ...

  9. Python自动化运维之1、Python入门

    Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...

随机推荐

  1. View (一)LayoutInflater()方法详解

    相信接 触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用于加载布局的.而刚接触Android的朋友可能对 LayoutInflater不怎么熟悉,因为加载布 ...

  2. Hashtable 数据遍历的几种方式

    Hashtable 在集合中称为键值对,它的每一个元素的类型是 DictionaryEntry,由于Hashtable对象的键和值都是Object类型,决定了它可以放任何类型的数据, 下面我就把Has ...

  3. 17Mybatis_动态sql-sql片段

    这篇文章讲一下sql片段. 讲一下sql片段的的需求: 将上边实现的动态sql判断代码块抽取出来,组成一个sql片段.其它的statement中就可以引用sql片段. 方便程序员进行开发. 第一步我们 ...

  4. 在线运行Javascript,Jquery,HTML,CSS代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xht ...

  5. C语言 百炼成钢16

    //题目46:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只 //猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 //一个,它同样把 ...

  6. 加密算法使用(四):AES的使用

    AES是一种对称加密方式,比DES更为安全,用一个秘钥加密数据之后,可以用同一个秘钥对加密后的数据解密还原,以下是一套以字符串为例子的使用全过程演示, 用到了 commons-codec.jar pa ...

  7. webapi 获取请求参数

    //获取请求消息提数据 Stream stream = filterContext.Request.Content.ReadAsStreamAsync().Result; Encoding encod ...

  8. Java的动态代理(dynamic proxy)

    什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...

  9. navigator.sendBeancon方法简介

    之所以介绍这个还在草案中的方法,是源于最近新做的一个活动.该活动有个需求,就是用户离开该页面的某个时间段之后,发个请求给该用户送券.后来是通过setTimeout来做的,用户离开该页面,该页面进入后台 ...

  10. activiti-explorer:使用mysql导入外部bpmn文件后存在乱码的问题

    我已经采取了如下步骤,但是仍然还是乱码 1. 在mysql中创建数据库时指定使用utf8编码: CREATE DATABASE Activiti DEFAULT CHARACTER SET utf8 ...