思路:首先将hate和friend建边求其次2-SAT问题,判断是否能有解,没解就输出-1,否则用二分枚举最大的长度,将两个barn的距离小于mid的看做是矛盾,然后建边,求2-SAT问题。找出最优解。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<vector>
  7. #define Maxn 3010
  8. #define Maxm 1000000
  9. using namespace std;
  10. int dfn[Maxn],low[Maxn],vi[Maxn],head[Maxn],e,n,m,lab,top,Stack[Maxn],num,id[Maxn],A,B,ss;
  11. struct Edge{
  12. int u,v,next,l;
  13. }edge[Maxm];
  14. struct Point{
  15. int x,y;
  16. }p[Maxn],s1,s2;
  17. struct Match{
  18. int a,b;
  19. }hate[Maxn],Friend[Maxn];
  20. void init()
  21. {
  22. int i,j;
  23. memset(dfn,,sizeof(dfn));
  24. memset(low,,sizeof(low));
  25. memset(head,-,sizeof(head));
  26. memset(id,,sizeof(id));
  27. memset(vi,,sizeof(vi));
  28. e=lab=num=top=;
  29. }
  30. void add(int u,int v)
  31. {
  32. edge[e].u=u,edge[e].v=v,edge[e].next=head[u],head[u]=e++;
  33. }
  34. int Dis(Point a,Point b)
  35. {
  36. return abs(a.x-b.x)+abs(a.y-b.y);
  37. }
  38. void Tarjan(int u)
  39. {
  40. int i,j,v;
  41. dfn[u]=low[u]=++lab;
  42. Stack[top++]=u;
  43. vi[u]=;
  44. for(i=head[u];i!=-;i=edge[i].next)
  45. {
  46. v=edge[i].v;
  47. if(!dfn[v])
  48. {
  49. Tarjan(v);
  50. low[u]=min(low[u],low[v]);
  51. }
  52. if(vi[v])
  53. low[u]=min(low[u],dfn[v]);
  54. }
  55. if(low[u]==dfn[u])
  56. {
  57. ++num;
  58. do{
  59. i=Stack[--top];
  60. vi[i]=;
  61. id[i]=num;
  62. }while(i!=u);
  63. }
  64. }
  65. void build(int mid)
  66. {
  67. int i,j;
  68. init();
  69. for(i=;i<=n;i++)
  70. for(j=;j<=n;j++){
  71. if(j==i)
  72. continue;
  73. if(Dis(p[i],s1)+Dis(p[j],s1)>mid)
  74. {
  75. add(i,j+n);
  76. add(j,i+n);
  77. }
  78. if(Dis(p[i],s2)+Dis(p[j],s2)>mid)
  79. {
  80. add(i+n,j);
  81. add(j+n,i);
  82. }
  83. if(Dis(p[i],s1)+Dis(p[j],s2)+ss>mid)
  84. {
  85. add(i,j);
  86. add(j+n,i+n);
  87. }
  88. if(Dis(p[i],s2)+Dis(p[j],s1)+ss>mid)
  89. {
  90. add(j,i);
  91. add(i+n,j+n);
  92. }
  93. }
  94. for(i=;i<=A;i++)
  95. {
  96. add(hate[i].a,hate[i].b+n);
  97. add(hate[i].b,hate[i].a+n);
  98. add(hate[i].a+n,hate[i].b);
  99. add(hate[i].b+n,hate[i].a);
  100. }
  101. for(i=;i<=B;i++)
  102. {
  103. add(Friend[i].a,Friend[i].b);
  104. add(Friend[i].a+n,Friend[i].b+n);
  105. add(Friend[i].b,Friend[i].a);
  106. add(Friend[i].b+n,Friend[i].a+n);
  107. }
  108. }
  109. int cal()
  110. {
  111. int i;
  112. for(i=;i<=n*;i++)
  113. {
  114. if(!dfn[i])
  115. Tarjan(i);
  116. }
  117. for(i=;i<=n;i++)
  118. {
  119. if(id[i]==id[i+n])
  120. return ;
  121. }
  122. return ;
  123. }
  124. int solve()
  125. {
  126. int i,j;
  127. for(i=;i<=A;i++)
  128. {
  129. add(hate[i].a,hate[i].b+n);
  130. add(hate[i].b,hate[i].a+n);
  131. add(hate[i].a+n,hate[i].b);
  132. add(hate[i].b+n,hate[i].a);
  133. }
  134. for(i=;i<=B;i++)
  135. {
  136. add(Friend[i].a,Friend[i].b);
  137. add(Friend[i].a+n,Friend[i].b+n);
  138. add(Friend[i].b,Friend[i].a);
  139. add(Friend[i].b+n,Friend[i].a+n);
  140. }
  141. if(!cal())
  142. return -;
  143. int l,r,mid;
  144. l=;r=;
  145. while(l+<r)
  146. {
  147. mid=(l+r)>>;
  148. build(mid);
  149. if(cal())
  150. r=mid;
  151. else
  152. l=mid;
  153. }
  154. return r;
  155. }
  156. int main()
  157. {
  158. int i,j,a,b,c;
  159. while(scanf("%d%d%d",&n,&A,&B)!=EOF)
  160. {
  161. init();
  162. scanf("%d%d%d%d",&s1.x,&s1.y,&s2.x,&s2.y);
  163. for(i=;i<=n;i++)
  164. scanf("%d%d",&p[i].x,&p[i].y);
  165. for(i=;i<=A;i++)
  166. scanf("%d%d",&hate[i].a,&hate[i].b);
  167. for(i=;i<=B;i++)
  168. scanf("%d%d",&Friend[i].a,&Friend[i].b);
  169. ss=Dis(s1,s2);
  170. printf("%d\n",solve());
  171. }
  172. return ;
  173. }

poj 2749 2-SAT问题的更多相关文章

  1. HDU 1815, POJ 2749 Building roads(2-sat)

    HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...

  2. Java实现 POJ 2749 分解因数(计蒜客)

    POJ 2749 分解因数(计蒜客) Description 给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * - * an,并且1 < a1 <= ...

  3. poj 2749

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6091   Accepted: 2046 De ...

  4. poj 2749 Building roads (二分+拆点+2-sat)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6229   Accepted: 2093 De ...

  5. POJ 2749 2SAT判定+二分

    题意:图上n个点,使每个点都与俩个中转点的其中一个相连(二选一,典型2-sat),并使任意两点最大 距离最小(最大最小,2分答案),有些点相互hata,不能选同一个中转点,有些点相互LOVE,必需选相 ...

  6. poj 1687 Buggy Sat 简单计算几何

    暑期集训出的第一道一血 感觉自己萌萌哒…… 这道题本身并没有坑点 仅仅是翻译巨坑…… 解大腿在做B 安学长在做E 我闲着也没事 就一个词一个词翻译F…… 最后感觉…… 题干大多数都看不懂…… 也都没啥 ...

  7. [poj] 2749 building roads

    原题 2-SAT+二分答案! 最小的最大值,这肯定是二分答案.而我们要2-SATcheck是否在该情况下有可行解. 对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来 ...

  8. POJ 2749 Building roads 2-sat+二分答案

    把爱恨和最大距离视为限制条件,可以知道,最大距离和限制条件多少具有单调性 所以可以二分最大距离,加边+check #include<cstdio> #include<algorith ...

  9. TTTTTTTTTTT POJ 2749 修牛棚 2-Sat + 路径限制 变形

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7019   Accepted: 2387 De ...

随机推荐

  1. 【C语言】-循环的嵌套

    循环的嵌套:当在一个循环语句中嵌入另一个循环时,成为循环的嵌套. 循环嵌套的形式: (1)for语句中嵌入for语句: for ( ) { for ( ) { ... } } (2)for语句嵌入wh ...

  2. [C语言 - 3] 字符串

    字符数组 char * 看做一个特殊的字符数组, 在字符串结束为止添加'\0'结束符 (ASCII码0), 没有\0结尾的是普通的字符数组. 使用双引号定义的字符串自动在尾部加上\0 puts(s)函 ...

  3. jQuery基础学习5——JavaScript方法获取页面中的元素

    给网页中的所有<p>元素添加onclick事件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  4. c++结束进程的程序

    //#include <winbase.h> #include <windows.h> #include <process.h> #include <Tlhe ...

  5. python的locals()妙用

    如果你是个喜欢偷懒的程序员并想让代码看起来更加简明,可以利用 Python 的内建函数 locals() .它返回的字典对所有局部变量的名称与值进行映射.因此,前面的视图可以重写成下面这个样子:def ...

  6. 通过OAF实现RTF多语言

    职责: Oracle XML Publisher 管理员 -->主页 -->模板 -->创建模板 1.定义rtf模板时 在创建模板时,勾选可转换.      

  7. radio select的 option使用

    1  radio的使用 <td id="sex">性别:              <input type="radio" name=&quo ...

  8. python中List操作

    传送门 官方文件地址 list.append(x): 将x加入列表尾部,等价于a[len(a):] = [x] 例: >>> list1=[1,2,3,4] >>> ...

  9. CSS 布局总结——变宽度布局

    变宽度布局 1-2-1 等比例变宽 总宽度设置 width: 85%; min-width: 650px; (关于IE6的min-width支持,可用) content 设置 width: 66%;  ...

  10. Note of IOS 7 - Views

    1. Views presentation: A view (an object whose class is UIView or a subclass of UIView) knows how to ...