BZOJ 2007 海拔

http://www.lydsy.com/JudgeOnline/problem.php?id=2007

思路:

显然海拔是一片0,另一片1,答案就是01的分界线的流量。

本题中的图是平面图,所以求最小割的时候,可以转换成对偶图最短路,据Gword说:有向边就统一让它顺时针旋转90°,还有,要先将S和T连边,来"劈开"最外面的空白,然后再把S和T分开。

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<queue>
 7 using namespace std;
 8 int first[250005],next[2000005],go[2000005],tot,val[2000005];
 9 int dis[250005],vis[250005],S,T,n;
10 int read(){
11     char ch=getchar();int t=0,f=1;
12     while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
13     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
14     return t*f;
15 }
16 void insert(int x,int y,int z){
17     tot++;
18     go[tot]=y;
19     next[tot]=first[x];
20     first[x]=tot;
21     val[tot]=z;
22 }
23 void add(int x,int y,int z){
24     insert(x,y,z);
25 }
26 int id(int x,int y){
27     if (x==0||y==n+1) return T;
28     if (x==n+1||y==0) return S;
29     return (x-1)*n+y;
30 }
31 void dijkstra(){
32     memset(dis,127/3,sizeof dis);
33     priority_queue< pair<int,int> ,vector< pair<int,int> > ,greater<pair<int,int> > > Q;
34     dis[S]=0;
35     Q.push(make_pair(0,S));
36     while (!Q.empty()){
37         int now=Q.top().second;Q.pop();
38         if (vis[now]) continue;
39         vis[now]=1;
40         for (int i=first[now];i;i=next[i]){
41             int pur=go[i];
42             if (dis[pur]>dis[now]+val[i]){
43                 dis[pur]=dis[now]+val[i];
44                 Q.push(make_pair(dis[pur],pur));
45             }
46         }
47     }
48 }
49 int main(){
50     n=read();
51     S=0,T=n*n+1;
52     for (int i=1;i<=n+1;i++)
53      for (int j=1;j<=n;j++)
54       add(id(i,j),id(i-1,j),read());
55     for (int i=1;i<=n;i++)
56      for (int j=1;j<=n+1;j++)
57       add(id(i,j-1),id(i,j),read());
58     for (int i=1;i<=n+1;i++)
59      for (int j=1;j<=n;j++)
60       add(id(i-1,j),id(i,j),read());
61     for (int i=1;i<=n;i++)
62      for (int j=1;j<=n+1;j++)
63       add(id(i,j),id(i,j-1),read());
64     dijkstra();
65     printf("%d\n",dis[T]);
66 }
时间: 2024-11-09 00:52:55

BZOJ 2007 海拔的相关文章

BZOJ 2007 海拔(平面图最小割-最短路)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点之间有两条边,这两条边是有向的,边上有权值..左上角为源点,右下角为汇点,求s到t的最小割. 思路:很明显这是一个平面图,将其转化为最 短路.我们将s到t之间连一条边,左下角为新图的源点S,右上角区域为新图的终点T,并且为每个格子编号.由于边是有向的,我们就要分析下这条边应该是哪 个点向哪个点的边.

BZOJ 2007 NOI 2010 海拔 平面图最小割-&gt;最短路SPFA+pq

题目大意:给出一个城市各个道路的双向流量,城市的左上角的高度是0,城市的右下角的高度是1,若人流升高海拔就会消耗体力,问最小需要消耗多少体力. 思路:这道题才是真正的让我见识到了algorithm中的heap的强大. 分析这道题可以发现,一定会有一条分界线,这个分界线左边高度都为0,右边高度都是1,然后找到这条分界点就可以了.明显的最小割.但是数据量巨大,直接跑最大流会T,又是平面图,建立对偶图然后跑最短路,SPFA+pq在BZOJ上可以很快,如果有的OJ卡STL的话可以考虑SPFA+Heap,

BZOJ 2007 NOI2010 海拔 平面图最小割

题目大意:YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口.下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路. 小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的人流量,即在高峰期间沿着

bzoj 2007 [Noi2010]海拔——最小割转最短路

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连通块全是1的点. 注意从东到西还有从南到北的边也有用!因为不一定是一个阶梯形的,还可以拐来拐去,只是一定是两个连通块罢了. 所以最小割一下那个分界线就行了.但会TLE. #include<cstdio> #include<cstring> #include<algorithm&g

bzoj 2007: [Noi2010]海拔

1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<cstring> 5 #define pa pair<int,int> 6 #define M 250005 7 using namespace std; 8 int S,T,cnt=1,ans,head[M],next[10*M],u[10*M],v[10*M],d[M],f[M],n; 9 int p(in

【BZOJ2007】【Noi2010】海拔 平面图最小割转最短路

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43280891"); } 题解:这个模型很水,不需要极角序神马转对偶图,直接乱搞就行. 然后目的是把图割开,那么只需要跑S->T最短路就行. 要做平面图转对偶图不妨去这篇. [BZOJ2965]保护古迹 平面图转对偶图,暴力,网络流 还有就是某人

「网络流」

$Tasklist$ 无限之环 星际竞速 4823: 老C的方块 2007: 海拔 还有51nod上的 集合交易 「奇怪的游戏」:小学数学+最大流 如果不相等,算出来要多叠多少层,否则答案具有二分性.check用最大流 土兵占领:补集转化+最小割 转化为最多有多少士兵能同时给一行和一列作出贡献,然后最小割可以做 「紧急疏散」:增量+最大流 必须根据时间拆点,而不能每经过一个时间给终点流量+1,因为不能让后面的人占用前面的流量 狼抓兔子:最小割/对偶图 不管写最小割还是对偶图都是模板 「切糕」:最

2007: [Noi2010]海拔 - BZOJ

Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口.下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路. 小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的人流量,即

BZOJ 1176 Balkan 2007 Mokia CDQ分治

题目大意:有一些操作,给一个坐标代表的点加上一个数,和求出一个矩形中的所有数的和. 思路:一眼题,二位树状数组水过. ... .. . 哪里不对?W<=2000000.逗我?这n^2能开下? 这个时候CDQ神牛又来帮助我们了. 这个题应该算是CDQ分治的模板题了吧,简单分析一下,其实不难. 写这个题之前建议写一下BZOJ 1935 SHOI 2007 Tree 园丁的烦恼 树状数组这个题,是本题的简化版. 按照正常的解法,我们应该建立一个二位的数据结构,然后分别维护两维的信息.如果用动态开点的线