2-SAT简单题,判断一下两个开区间是否相交

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<queue>
  5. #include<vector>
  6. #include<stack>
  7. #include<algorithm>
  8. using namespace std;
  9.  
  10. const int maxn=+;
  11. int N,M;
  12. struct Time
  13. {
  14. int Start;
  15. int End;
  16. int cost;
  17. int S1,E1,S2,E2;
  18. } t[maxn];
  19. char s[];
  20.  
  21. struct TwoSAT
  22. {
  23. int n;
  24. vector<int> G[maxn*];
  25. bool mark[maxn*];
  26. int S[maxn*],c;
  27.  
  28. bool dfs(int x)
  29. {
  30. if(mark[x^]) return false;
  31. if(mark[x]) return true;
  32. mark[x]=true;
  33. S[c++]=x;
  34. for(int i=;i<G[x].size();i++)
  35. if(!dfs(G[x][i])) return false;
  36. return true;
  37. }
  38.  
  39. void init(int n)
  40. {
  41. this->n=n;
  42. for(int i=;i<n*;i++) G[i].clear();
  43. memset(mark,,sizeof mark);
  44. }
  45.  
  46. void add_clause(int x,int y)
  47. {
  48. G[x].push_back(y^);
  49. G[y].push_back(x^);
  50. }
  51.  
  52. bool solve()
  53. {
  54. for(int i=;i<*n;i+=)
  55. if(!mark[i]&&!mark[i+])
  56. {
  57. c=;
  58. if(!dfs(i))
  59. {
  60. while(c>) mark[S[--c]]=false;
  61. if(!dfs(i+)) return false;
  62. }
  63. }
  64. return true;
  65. }
  66. };
  67.  
  68. bool F(int x1,int y1,int x2,int y2)
  69. {
  70. if(x1<x2&&x2<y1) return ;//区间相交
  71. if(x1<y2&&y2<y1) return ;//区间相交
  72. if(x2<x1&&x1<y2) return ;//区间相交
  73. if(x2<y1&&y1<y2) return ;//区间相交
  74. if(x1==x2||y1==y2) return ;//区间相交
  75. return ;//区间不相交
  76. }
  77.  
  78. int main()
  79. {
  80. while(~scanf("%d",&N))
  81. {
  82. TwoSAT T; T.n=N; T.init(N);
  83. for(int i=; i<N; i++)
  84. {
  85. int h1,h2,m1,m2,tt;
  86.  
  87. scanf("%s",s);
  88. h1=(s[]-'')*+(s[]-'');
  89. m1=(s[]-'')*+(s[]-'');
  90.  
  91. scanf("%s",s);
  92. h2=(s[]-'')*+(s[]-'');
  93. m2=(s[]-'')*+(s[]-'');
  94.  
  95. scanf("%d",&tt);
  96.  
  97. t[i].Start=h1*+m1;
  98. t[i].End=h2*+m2;
  99. t[i].cost=tt;
  100.  
  101. t[i].S1=t[i].Start;
  102. t[i].E1=t[i].Start+t[i].cost;
  103.  
  104. t[i].S2=t[i].End-t[i].cost;
  105. t[i].E2=t[i].End;
  106. }
  107.  
  108. for(int i=;i<N;i++)
  109. {
  110. for(int j=i+;j<N;j++)
  111. {
  112. if(F(t[i].S1,t[i].E1,t[j].S1,t[j].E1))
  113. T.add_clause(*i,*j);
  114. if(F(t[i].S1,t[i].E1,t[j].S2,t[j].E2))
  115. T.add_clause(*i,*j+);
  116. if(F(t[i].S2,t[i].E2,t[j].S1,t[j].E1))
  117. T.add_clause(*i+,*j);
  118. if(F(t[i].S2,t[i].E2,t[j].S2,t[j].E2))
  119. T.add_clause(*i+,*j+);
  120. }
  121. }
  122. if(T.solve())
  123. {
  124. printf("YES\n");
  125. for(int i=;i<N;i++)
  126. {
  127. if(T.mark[*i]) printf("%02d:%02d %02d:%02d\n",t[i].S1/,t[i].S1%,t[i].E1/,t[i].E1%);
  128. else printf("%02d:%02d %02d:%02d\n",t[i].S2/,t[i].S2%,t[i].E2/,t[i].E2%);
  129. }
  130. }
  131. else printf("NO\n");
  132. }
  133. return ;
  134. }

POJ 3683 Priest John's Busiest Day的更多相关文章

  1. POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题)

    POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题) Descripti ...

  2. POJ 3683 Priest John's Busiest Day(2-SAT+方案输出)

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10010   Accep ...

  3. POJ 3683 Priest John's Busiest Day (2-SAT)

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6900   Accept ...

  4. POJ 3683 Priest John's Busiest Day(2-SAT 并输出解)

    Description John is the only priest in his town. September 1st is the John's busiest day in a year b ...

  5. poj - 3683 - Priest John's Busiest Day(2-SAT)

    题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...

  6. POJ 3683 Priest John's Busiest Day (2-SAT)

    题意:有n对新人要在同一天结婚.结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席.神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间.问神父能否出席所有仪式,如 ...

  7. POJ 3683 Priest John's Busiest Day (2-SAT,常规)

    题意: 一些人要在同一天进行婚礼,但是牧师只有1个,每一对夫妻都有一个时间范围[s , e]可供牧师选择,且起码要m分钟才主持完毕,但是要么就在 s 就开始,要么就主持到刚好 e 结束.因为人数太多了 ...

  8. POJ 3683 Priest John's Busiest Day[2-SAT 构造解]

    题意: $n$对$couple$举行仪式,有两个时间段可以选择,问是否可以不冲突举行完,并求方案 两个时间段选择对应一真一假,对于有时间段冲突冲突的两人按照$2-SAT$的规则连边(把不冲突的时间段连 ...

  9. POJ 3683 Priest John's Busiest Day 【2-Sat】

    这是一道裸的2-Sat,只要考虑矛盾条件的判断就好了. 矛盾判断: 对于婚礼现场 x 和 y,x 的第一段可以和 y 的第一段或者第二段矛盾,同理,x 的第二段可以和 y 的第一段或者第二段矛盾,条件 ...

随机推荐

  1. <context:annotation-config> 和 <context:component-scan>的区别

    转自:GOOD spring <context:annotation-config> 跟 <context:component-scan>诠释及区别 <context:a ...

  2. Box of Bricks

    Box of Bricks Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  3. JavaScript学习总结(十七)——Javascript原型链的原理

    一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中, ...

  4. 读苹果开发文档时遇到瓶颈,转而花2天看了Objc基本语法

    根据这篇博客中列出的文章开始看Objc基本语法: http://blog.hellolucky.info/articles/ios-beginner-ios-development/ 看完以后,明白多 ...

  5. Eclipse 安装 HDFS 插件

    Eclipse 安装 hdfs 连接插件 1.插件安装 在$HADOOP_HOME/contrib/eclipse-plugin/文件夹中有个hadoop-eclipse-plugin-0.20.20 ...

  6. 笨方法学python--提问

    1 实现 用户在终端进行输入 的方法 print "how old are you?", age = raw_input() 该地方,第1名后面加逗号,然后必须换行 2 若要限制用 ...

  7. wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选

    在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...

  8. 【转】How to build and install PHP 5.6.9 from source on Ubuntu 14.04 VPS

    原文 https://vpsineu.com/blog/how-to-build-and-install-php-5-6-9-from-source-on-ubuntu-14-04-vps/ In t ...

  9. 【jsp 练习】 给定三角形三边判断是否能组成三角形及计算面积

    Test.java package package1; public class Test { double side1 = -1 , side2 = -1 , side3 = -1 , area = ...

  10. 【单源最短路】dijstra poj 1502

    #include <cstdio> #include <iostream> #include <stdlib.h> #include <memory.h> ...