NOI-2010-海拔
来源:互联网 发布:牛津纺衬衫搭配知乎 编辑:程序博客网 时间:2024/06/10 19:55
题目描述
YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为
小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的人流量,即在高峰期间沿 着该方向通过这条道路的人数。每一个交叉路口都有不同的海拔高度值,YT市市民认为爬坡是一件非常累的事情,每向上爬
小Z还测量得到这个城市西北角的交叉路口海拔为
输入输出格式
输入格式:
第一行包含一个整数n,含义如上文所示。
接下来
输出格式:
仅包含一个数,表示在最理想情况下每天上班高峰期间所有人爬坡所消耗的总体力和(即总体力和的最小值),结果四舍五入到整数。
输入输出样例
输入样例#1:
1
1
2
3
4
5
6
7
8
输出样例#1:
3
说明
对于20%的数据:
对于50%的数据:
对于80%的数据:
对于100%的数据:
题目概要
给定一方格图,每条边双向权值不同,每条边的贡献定义为
思路
首先这题一看就不是一道友善的题,谁知道每个点点权啊,难道要每个枚举,然而每个点的点权又没有限制,小到无穷小,大到long long都hold不住,暴力分在(=@__@=)哪里?
算了,这题还是从拿部分分开始考虑吧
首先我们看到
但是我们可以发现,如果各点点权大于
但是
这时发现每个点只可能是
虽然为了拿这送给像我一样的蒟蒻
好了,让我们迈向更高分的暴力,我们又发现,由于整个矩阵就是
所以我们只要枚举分界线即可解决(本蒟蒻因为不会打插头所以未测,所以
这时就有dalao跳出来了:
这不就是一道最小割的裸题吗?
dalao就是dalao,一下就擦到了正解,为什么是“擦”到了正解呢?
原因是最大流强大的复杂度为这是本蒟蒻第一次发现网络流这种高级算法作为暴力分出现
这时就引入一种蒟蒻忒喜欢的算法——最短路
至于最短路和网络流有啥关系,就想想,如果要将左上角到右下角的关系全数切断,就可以视为有一条从左下角到右上角的贯穿矩阵的线,而这条线一定是由多条跨越流路的线链接而成(其实就是多条割线),如果将方格作为点,跨越流路的的割作为路径,就可以将最小割问题转化为从左下角外围方格到右上角外围方格的最短路问题,用上堆优化的dijkstra(本蒟蒻懒,用SLF的SPFA),复杂度
代码
#include<bits/stdc++.h>using namespace std;#define rg register#define cl1(x) memset(x,-1,sizeof(x))template <typename _Tp> inline void read(_Tp &x){ char c11=getchar();x=0;while(c11<'0'||c11>'9')c11=getchar(); while(c11>='0'&&c11<='9'){x=x*10+c11-'0';c11=getchar();}}const int maxn=505,maxx=1e6+1e4;int n,s=maxx-2,t=maxx-1;int dis[maxx];struct node{int v,nxt,w;}a[maxx];int head[maxx],p=0;inline void add(int,int,int);int spfa(){ deque <int> q; cl1(dis); dis[s]=0; q.push_back(s); while(!q.empty()){ int x=q.front(); q.pop_front(); for(rg int i=head[x];i;i=a[i].nxt) if(dis[a[i].v]==-1||dis[a[i].v]>dis[x]+a[i].w){ dis[a[i].v]=dis[x]+a[i].w; if(dis[a[i].v]<dis[q.front()])q.push_front(a[i].v); else q.push_back(a[i].v); } } return dis[t];}/*int spfa(){ queue <int> q; cl1(dis); dis[s]=0; q.push(s); while(!q.empty()){ int x=q.front(); q.pop(); for(rg int i=head[x];i;i=a[i].nxt) if(dis[a[i].v]==-1||dis[a[i].v]>dis[x]+a[i].w){ dis[a[i].v]=dis[x]+a[i].w; if(dis[a[i].v]<dis[q.front()])q.push(a[i].v); else q.push(a[i].v); } } return dis[t];}*/void init(){ read(n); // left-->right up-->down int x; for(rg int i=0;i<=n;i++) for(rg int j=1;j<=n;j++){ read(x); if(i==n) add(s,(i-1)*n+j,x); else if(!i) add(j,t,x); else add(i*n+j,(i-1)*n+j,x); } for(rg int i=1;i<=n;i++) for(rg int j=0;j<=n;j++){ read(x); if(!j) add(s,(i-1)*n+j+1,x); else if(j==n) add(i*n,t,x); else add((i-1)*n+j,(i-1)*n+j+1,x); } for(rg int i=0;i<=n;i++) for(rg int j=1;j<=n;j++){ read(x); if(i==n) add((i-1)*n+j,s,x); else if(!i) add(t,j,x); else add((i-1)*n+j,i*n+j,x); } for(rg int i=1;i<=n;i++) for(rg int j=0;j<=n;j++){ read(x); if(!j) add((i-1)*n+j+1,s,x); else if(j==n) add(t,i*n,x); else add((i-1)*n+j+1,(i-1)*n+j,x); }}int main(){ init(); printf("%d\n",spfa()); return 0;}inline void add(int u,int v,int w){ a[++p].v=v; a[p].w=w; a[p].nxt=head[u]; head[u]=p;}
好像发现这题的做法还是挺丰富的吼
- NOI-2010-海拔
- noi 2010 海拔
- noi 2010 海拔
- NOI 2010 海拔 //有向边的平面图最小割
- [BZOJ 2007][NOI 2010]海拔(平面图最小割)
- BZOJ 2007 NOI 2010 海拔 平面图最小割->最短路SPFA+pq
- NOI 2010
- CCF NOI 2010 Day1
- NOI 2010 超级钢琴
- 【总结】NOI 2010
- NOI 2010 题解
- NOI 2010 能量采集
- NOI
- 海拔8848
- [NOI2010]海拔
- 上海海拔
- 【NOI2010】海拔
- NOI2010 海拔
- 支付宝现金红包,免费领取,小伙伴们,给大家发红包喽!
- 游戏跨时区多时区解决方案
- testng+maven+java+idea 接口测试入门三:与jenkins集成
- java后台实现生成二维码并且上传的详细介绍
- Prime Ring Problem(HDU-1016)
- NOI-2010-海拔
- Android MVC和MVP架构的详解
- java中Integer对象127之前的数缓冲
- CCF考试——201703-1分蛋糕
- dfs和回溯法的应用以及模板
- jquery简介
- 事件委托,事件绑定,事件冒泡原理
- 问题 I: 锤子剪刀布 (20)
- MapReduce的Shuffle过程