上来就跑3e5的最大流--脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 跑个最小割就好了 然而跑不过,考虑建对偶图,也就是网格的空当成一个点,然后这些点之间互相连边的权值为原图穿过他们的边的权值,建立一对原点汇点,分别连左下边界的新点和右上边界的新点,这样跑最短路就是最小割 方便的建图是把所有边转90度就是新边 #include<iostream> #include…
建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring> #include <algorithm> #include <queue> ; const int maxV=maxN*maxN; const int inf=0x3f3f3f3f; struct Edge { int to,next; int dist; void assig…
bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj  luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所有$0$连成一块,所有$1$连成一块 只有海拔交界线对答案有贡献,变成了最小割 但是数据范围很明显不能直接跑网络流 由于这是一个平面图,所以根据套路想到: 平面图最小割=对偶图最小环=最外一块面积分成$S$和$T$跑最短路 从左上角往右下角画一条线把外面一块分成$S$和$T$之后建图. 但是要注意这…
题意:有一张平面图,求它的最小割.N,M.表示网格的大小,N,M均小于等于1000. 左上角点为(1,1),右下角点为(N,M).有以下三种类型的道路  1:(x,y)<==>(x+1,y)  2:(x,y)<==>(x,y+1)  3:(x,y)<==>(x+1,y+1)    思路:第一眼看就是一个最小割=最大流,但点数1000000,边数6000000过大 所以要平面图最小割转最短路 详情见周驿东<浅析最大最小定理在信息学竞赛中的应用> n=1和m=1…
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 来替换,获得同样的效果. 虽然输出的答案要求是四舍五入到整数,但其实答案就是一个整数! 那么高度就一定是 0 或 1 了,并且还有一点,所有选 0 的点都连通,所有选 1 的点都联通.因为如果一个选 0 的点被选 1 的点包围,那么它选 1 更优. 于是整个图中所有的点分成了与左上角相连的集合 A…
题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边,因为最小割的形状可能很奇怪. //16232kb 456ms //平面图点数就是(n-1)^2了.但是边数不是4(n-1)^2,是4n(n-1)!.. #include <queue> #include <cstdio> #include <cctype> #includ…
首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这个点变为周围海拔一样的显然能使结果变优. 于是问题就变成了,这个图的海拔为0的联通块和起点连在一起,海拔为1的联通块和终点连在一起. 此即为经典的最小割. 由于此图为平面图,我们可以使用平面图最小割转对偶图最短路优化算法. 因为这是有向图,因此构建对偶图的时候注意边的方向即可. # include <c…
问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海拔为 \(0\) 的点,一定能够在这个网格图中由一条连续的线划分为两个集合. 将一个图中的所有结点划分为两个集合,显然为最小割模型. 又发现是网格图,所以平面图最小割转化为对偶图最短路. \(\mathrm{Code}\) 不删调试见祖宗 #include<bits/stdc++.h> using…
2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2410  Solved: 1142[Submit][Status][Discuss] Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个 正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路 (简称道路),每条双向道路连…
传送门 不明白为什么大佬们一眼就看出这是最小割…… 所以总而言之这就是一个最小割我也不知道为什么 然后边数太多直接跑会炸,所以要把平面图转对偶图,然后跑一个最短路即可 至于建图……请看代码我实在无能为力 //minamoto #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define getc() (p1==p2&…