POJ 2749 Building roads 2-sat+二分答案
把爱恨和最大距离视为限制条件,可以知道,最大距离和限制条件多少具有单调性
所以可以二分最大距离,加边+check
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 #include<stack> 6 #define N 5010 7 #define INF 4000000 8 using namespace std; 9 int dis1[N],a,b,n,dis2[N],sx1,sy1,sx2,sy2,head[N],dfn[N],low[N],ecnt,x[N],y[N],tmp,ok,belong[N],hate[N][3],love[N][3],indx,inst[N],cnt; 10 stack <int> st; 11 int read() 12 { 13 int ret=0,neg=1; 14 char j=getchar(); 15 for (;j>'9' || j<'0';j=getchar()) 16 if (j=='-') neg=-1; 17 for (;j>='0' && j<='9';j=getchar()) 18 ret=ret*10+j-'0'; 19 return ret*neg; 20 } 21 struct edge 22 { 23 int nxt,v; 24 }e[N*N]; 25 int ABS(int x) 26 { 27 return x>0?x:-x; 28 } 29 void add(int u,int v) 30 { 31 e[++ecnt].v=v; 32 e[ecnt].nxt=head[u]; 33 head[u]=ecnt; 34 } 35 void init() 36 { 37 memset(head,0,sizeof(head)); 38 memset(dfn,0,sizeof(dfn)); 39 ecnt=0; 40 indx=0; 41 cnt=0; 42 } 43 void buildG(int lim) 44 { 45 for (int i=1;i<=a;i++) 46 { 47 int u=hate[i][0],v=hate[i][1]; 48 add(u,v+n),add(v,u+n),add(u+n,v),add(v+n,u); 49 } 50 for (int i=1;i<=b;i++) 51 { 52 int u=love[i][0],v=love[i][1]; 53 add(u,v),add(v+n,u+n),add(u+n,v+n),add(v,u); 54 } 55 for (int i=1;i<=n;i++) 56 for (int j=i+1;j<=n;j++) 57 { 58 if (dis1[i]+dis2[j]+tmp>lim) 59 add(i,j),add(j+n,i+n); 60 if (dis2[i]+dis1[j]+tmp>lim) 61 add(i+n,j+n),add(j,i); 62 if (dis1[i]+dis1[j]>lim) 63 add(i,j+n),add(j,i+n); 64 if (dis2[i]+dis2[j]>lim) 65 add(i+n,j),add(j+n,i); 66 } 67 } 68 void tar(int u) 69 { 70 dfn[u]=low[u]=++indx; 71 inst[u]=1; 72 st.push(u); 73 for (int i=head[u];i;i=e[i].nxt) 74 { 75 int v=e[i].v; 76 if (!dfn[v]) 77 { 78 tar(v); 79 low[u]=min(low[v],low[u]); 80 } 81 else if (inst[v]) 82 low[u]=min(dfn[v],low[u]); 83 } 84 if (low[u]==dfn[u]) 85 { 86 int t; 87 ++cnt; 88 while (1) 89 { 90 t=st.top(); 91 inst[t]=0; 92 st.pop(); 93 belong[t]=cnt; 94 if (t==u) break; 95 } 96 } 97 } 98 int check(int lim) 99 { 100 init(); 101 buildG(lim); 102 for (int i=1;i<=2*n;i++) 103 if (!dfn[i]) tar(i); 104 for (int i=1;i<=n;i++) 105 if (belong[i]==belong[i+n]) return 0; 106 return 1; 107 } 108 int main() 109 { 110 n=read(),a=read(),b=read(); 111 sx1=read(),sy1=read(),sx2=read(),sy2=read(); 112 tmp=ABS(sx1-sx2)+ABS(sy1-sy2); 113 for (int i=1;i<=n;i++) 114 { 115 x[i]=read(),y[i]=read(); 116 dis1[i]=ABS(x[i]-sx1)+ABS(y[i]-sy1); 117 dis2[i]=ABS(x[i]-sx2)+ABS(y[i]-sy2); 118 } 119 for (int i=1;i<=a;i++) 120 hate[i][0]=read(),hate[i][1]=read(); 121 for (int i=1;i<=b;i++) 122 love[i][0]=read(),love[i][1]=read(); 123 int l=0,r=INF,mid; 124 while (l<r) 125 { 126 mid=(l+r)>>1; 127 if (check(mid)==1) r=mid; 128 else l=mid+1; 129 } 130 printf("%d\n",l==INF?-1:l); 131 return 0; 132 }
转载于:https://www.cnblogs.com/mrsheep/p/7855949.html
POJ 2749 Building roads 2-sat+二分答案相关推荐
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads 题目链接HDU 题目链接POJ 题意: 有n个牛棚, 还有两个中转站S1和S2, S1和S2用一条路连接起来. 为了使得随意牛棚两个 ...
- [poj] 2749 building roads
原题 2-SAT+二分答案! 最小的最大值,这肯定是二分答案.而我们要2-SATcheck是否在该情况下有可行解. 对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来 ...
- POJ 2749 Building roads
POJ_2749 一开始没有想到去二分距离,看了别人的报告之后恍然大悟. 这是一个2-SAT的问题,首先我们要去找到核心变量,可以看出每个牛的有着要么和S1相连,要么和S2相连的逻辑关系,因此可以把奶 ...
- POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
$ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...
- poj 3208 Apocalypse Someday 数位dp+二分答案
Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 2203 Accepted: 11 ...
- poj 1064 java_poj 1064(二分答案)
题意: 有N条绳子,长度分别为 length[1,2,3,........,N]. 如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长有多长? 结果保留两位小数. 题解: 二分可能的长度. AC ...
- poj 3258 River Hopscotch 二分答案
题目地址: http://poj.org/problem?id=3258 题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况) ...
- POJ 1064 Cable master (二分答案)
题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...
- POJ 3579 二分答案
POJ 3579 二分答案 文章目录 POJ 3579 二分答案 题目 思路 代码 题目 思路 排序,二分一下答案,然后对于每一个元素看一看加上这个答案tmp之后,在数列里面排在哪里,比a[i]+tm ...
最新文章
- 18个让程序员流泪的瞬间,已笑喷,哈哈哈哈哈哈!
- 微软Excel竟能实现CV算法:亚马逊工程师妙用,人脸检测、字符识别都不在话下...
- 3D Vision公开课 | 移动机器人视觉三维感知的现在与将来
- Linux下的进程池(1)
- CSU 1115: 最短的名字(字典树)
- unity 凸包算法
- 【深度学习案例】手写数字项目实现-3. Matlab深度学习模型训练
- cad2019菜单栏怎么调出来_cad怎样调出菜单栏(cad2016工具栏怎么调出来)
- hdu2122 poj2485 最小生成树
- 数据分析,机器学习学习用数据集[1]-搜狗新闻行业分类数据集(已分好训练测试和验证集)
- Aspose.word Java实现html转word,word转html
- Python操作MyS	QL
- 软件测试周刊(第08期):大过节的
- java facet 是什么_eclipse中project facet问题
- SQL 的一点简单的面试题求助
- 2021年煤气考试题库及煤气免费试题
- 控制科学与工程(自动化)保研经验【2】——南开、同济篇
- Windows驱动开发WDM (1) - 基本结构
- web server+app server
- cn.sample.mnn.detect A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid
热门文章
- Mapped Statements collection does not contain value for TaskMapper.selectByPrimaryKey
- 分类算法之贝叶斯网络(Bayesian networks)
- ACM网络赛金华赛区的一道关于树的题:Family Name List
- 艾伟_转载:把事件当作对象进行传递
- 让Sandcastle为你的类库生成类似于MSDN的帮助文档
- ubuntu16.04 安装CAJViewer 以及 安装wine /deepin-wine 图标异常的解决
- Verilog中testbench的设计,文件读取和写入操作
- html底部沉底显示,Footer部分永远沉底。
- XP新建管理员账户后administrator消失或者不能登录的解决方法!
- java --String类解决面试问题