BZOJ 2007 对偶图 解题报告
来源:互联网 发布:李嘉诚撤资 知乎 编辑:程序博客网 时间:2024/06/05 08:43
2007: [Noi2010]海拔
Description
YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域。简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形。从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口。下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路。 小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的人流量,即在高峰期间沿着该方向通过这条道路的人数。每一个交叉路口都有不同的海拔高度值,YT市市民认为爬坡是一件非常累的事情,每向上爬h的高度,就需要消耗h的体力。如果是下坡的话,则不需要耗费体力。因此如果一段道路的终点海拔减去起点海拔的值为h(注意h可能是负数),那么一个人经过这段路所消耗的体力是max{0, h}(这里max{a, b}表示取a, b两个值中的较大值)。 小Z还测量得到这个城市西北角的交叉路口海拔为0,东南角的交叉路口海拔为1(如上图所示),但其它交叉路口的海拔高度都无法得知。小Z想知道在最理想的情况下(即你可以任意假设其他路口的海拔高度),每天上班高峰期间所有人爬坡所消耗的总体力和的最小值。
Input
第一行包含一个整数n,含义如上文所示。接下来4n(n + 1)行,每行包含一个非负整数分别表示每一条道路每一个方向的人流量信息。输入顺序:n(n + 1)个数表示所有从西到东方向的人流量,然后n(n + 1)个数表示所有从北到南方向的人流量,n(n + 1)个数表示所有从东到西方向的人流量,最后是n(n + 1)个数表示所有从南到北方向的人流量。对于每一个方向,输入顺序按照起点由北向南,若南北方向相同时由西到东的顺序给出(参见样例输入)。
Output
仅包含一个数,表示在最理想情况下每天上班高峰期间所有人爬坡所消耗的总体力和(即总体力和的最小值),结果四舍五入到整数。
Sample Input
1
1
2
3
4
5
6
7
8
【解题报告】
不解释
代码如下:
/************************************************************** Problem: 2007 User: onepointo Language: C++ Result: Accepted Time:4072 ms Memory:30280 kb****************************************************************/#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;#define N 500010#define inf 0x3f3f3f3fint n;int cnt,head[N],dis[N],vis[N];struct Edge{int to,nxt,w;}e[N<<2];void adde(int u,int v,int w){ e[++cnt].to=v; e[cnt].w=w; e[cnt].nxt=head[u]; head[u]=cnt;}int SPFA(int s,int t){ memset(dis,inf,sizeof(dis)); deque<int> q;dis[s]=0,vis[s]=1; q.push_back(s); while(!q.empty()) { int now=q.front();q.pop_front();vis[now]=0; for(int i=head[now];~i;i=e[i].nxt) { int v=e[i].to; if(dis[v]>dis[now]+e[i].w) { dis[v]=dis[now]+e[i].w; if(!vis[v]) { vis[v]=1; if(!q.empty()) { if(dis[v]>dis[q.front()]) q.push_back(v); else q.push_front(v); } else q.push_back(v); } } } } return dis[t];}int main(){ cnt=0; memset(head,-1,sizeof(head)); scanf("%d",&n); int S=1,T=n*n+2; for(int i=0;i<=n;++i) for(int j=1;j<=n;++j) { int x;scanf("%d",&x); if(i==0) adde(1+j,T,x); if(i==n) adde(1,1+(i-1)*n+j,x); if(i>0&&i<n) adde(1+i*n+j,1+(i-1)*n+j,x); } for(int i=0;i<n;++i) for(int j=0;j<=n;++j) { int x;scanf("%d",&x); if(j==0) adde(1,1+i*n+1,x); if(j==n) adde(1+(i+1)*n,T,x); if(j>0&&j<n) adde(1+i*n+j,1+i*n+j+1,x); } for(int i=0;i<=n;++i) for(int j=1;j<=n;++j) { int x;scanf("%d",&x); if(i==0) adde(T,1+j,x); if(i==n) adde(1+(i-1)*n+j,1,x); if(i>0&&i<n) adde(1+(i-1)*n+j,1+i*n+j,x); } for(int i=0;i<n;++i) for(int j=0;j<=n;++j) { int x;scanf("%d",&x); if(j==0) adde(1+i*n+1,1,x); if(j==n) adde(T,1+(i+1)*n,x); if(j>0&&j<n) adde(1+i*n+j+1,1+i*n+j,x); } printf("%d\n",SPFA(S,T)); return 0;}
- BZOJ 2007 对偶图 解题报告
- BZOJ 2007 海拔 (对偶图 最短路)
- BZOJ 2007 浅谈对偶图优化网络流
- BZOJ 1588 TREAP 解题报告
- bzoj 3223 splay 解题报告
- BZOJ 3223 Splay 解题报告
- BZOJ 3224 TREAP 解题报告
- BZOJ 1820 DP 解题报告
- BZOJ 2144 LCA 解题报告
- BZOJ 4152 博弈论 解题报告
- BZOJ 1566 DP 解题报告
- BZOJ 3119 贪心 解题报告
- bzoj 1036 树链剖分 解题报告
- bzoj 3696 化合物 解题报告
- BZOJ 2563 贪心 解题报告
- BZOJ 3790 Manacher 解题报告
- BZOJ 2160 Manacher 解题报告
- BZOJ 2038 莫队 解题报告
- linux压缩命令总结
- emacs安装
- 《超越感觉》读后感
- 关于RabbitMQ的一些问题
- 获得全表扫描的对象
- BZOJ 2007 对偶图 解题报告
- JSTL——JSP Standard Tag Library JSP标志标签库
- 条件判断
- 十三、Shell函数:Shell函数返回值、删除函数、在终端调用函数
- mysql的内连接和外连接小例子
- msbuild.exe参数(.net 2.0)
- c++继承和派生
- cookie和session详解
- CF295B Greg and Graph(离线+Floyd)