【平面图最小割】BZOJ2007-[NOI2010]海拔
【题目大意】
城市被东西向和南北向的主干道划分为n×n个区域,包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路。现得到了每天每条道路两个方向的人流量。每一个交叉路口都有海拔,每向上爬h的高度,就需要消耗h的体力。如果是下坡的话,则不需要耗费体力。城市西北角的交叉路口海拔为0,东南角的交叉路口海拔为1。现在知道每条路两个方向的人流量,在最理想的情况下(即你可以任意假设其他路口的海拔高度),求每天所有人爬坡所消耗的总体力和的最小值。
【思路】
显然是一个平面图最小割,最基础的平面图最小割可以参考BZOJ1002狼爪兔子。转成对偶图,跑Dijkstra+堆优化。
问题在于,边是有向的(即两个方向的人流量是不同的),北南、南北、东西、西东应该如何对应对偶图中的方向呢?画了张图(我人生所有的画图都要献给平面图了……)
a
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #define S 0
- #define T (n*n)+1
- using namespace std;
- typedef long long ll;
- const int MAXN=*;
- const ll INF=;
- struct edge
- {
- int fr,to,len;
- };
- vector<edge> E[MAXN];
- int n;
- void addedge(int u,int v,int w)
- {
- E[u].push_back((edge){u,v,w});
- }
- int dijkstra()
- {
- priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > > que;
- ll dis[MAXN],vis[MAXN];
- memset(vis,,sizeof(vis));
- for (int i=S+;i<=T;i++) dis[i]=INF;
- dis[S]=;
- que.push(make_pair<ll,ll>(,S));
- while (!que.empty())
- {
- int head=que.top().second;que.pop();
- if (!vis[head])
- {
- vis[head]=;
- for (int i=;i<E[head].size();i++)
- {
- edge Edge=E[head][i];
- if (!vis[Edge.to] && dis[Edge.to]>dis[Edge.fr]+Edge.len)
- {
- dis[Edge.to]=dis[Edge.fr]+Edge.len;
- que.push(make_pair<ll,ll>(dis[Edge.to],Edge.to));
- }
- }
- }
- }
- return (dis[T]);
- }
- void init()
- {
- scanf("%d",&n);
- int t;
- for (int i=;i<=n+;i++)
- for (int j=;j<=n;j++)
- {
- scanf("%d",&t);
- if (i==) addedge((i-)*n+j,n*n+,t);
- else if (i==n+) addedge(,(i-)*n+j,t);
- else addedge((i-)*n+j,(i-)*n+j,t);
- }
- for (int i=;i<=n;i++)
- for (int j=;j<=n;j++)
- {
- scanf("%d",&t);
- if (j==) addedge(,(i-)*n+j+,t);
- else if (j==n) addedge(i*n,n*n+,t);
- else addedge((i-)*n+j,(i-)*n+j+,t);
- }
- for (int i=;i<=n+;i++)
- for (int j=;j<=n;j++)
- {
- scanf("%d",&t);
- if (i==) addedge(n*n+,(i-)*n+j,t);
- else if (i==n+) addedge((n-)*n+j,,t);
- else addedge((i-)*n+j,(i-)*n+j,t);
- }
- for (int i=;i<=n;i++)
- for (int j=;j<=n;j++)
- {
- scanf("%d",&t);
- if (j==) addedge((i-)*n+j+,,t);
- else if (j==n) addedge(n*n+,(i-)*n+j,t);
- else addedge((i-)*n+j+,(i-)*n+j,t);
- }
- }
- int main()
- {
- init();
- printf("%d\n",dijkstra());
- return ;
- }
【平面图最小割】BZOJ2007-[NOI2010]海拔的更多相关文章
- BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路
问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...
- B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...
- bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)
bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
- BZOJ 2007 海拔(平面图最小割转对偶图最短路)
首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...
- [BZOJ2007][NOI2010]海拔(对偶图最短路)
首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...
- tyvj P1209 - 拦截导弹 平面图最小割&&模型转化
P1209 - 拦截导弹 From admin Normal (OI)总时限:6s 内存限制:128MB 代码长度限制:64KB 背景 Background 实中编程者联盟为了培养技 ...
- hdu3870-Catch the Theves(平面图最小割)
Problem Description A group of thieves is approaching a museum in the country of zjsxzy,now they are ...
- 【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子
[题目大意]左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) ...
随机推荐
- MS Office CVE-2015-1641 恶意 Exploit 样本分析
MS Office CVE-2015-1641 恶意 Exploit 样本分析 在对最近的一个恶意 MS Office 文档样本进行分析时,我们发现了一些有趣的特性.这个文档利用 CVE-2015-1 ...
- Dream------scala--开发环境搭建
scala简介: scala是一门函数式编程和面向对象编程结合的语言 函数式编程非常擅长数值计算而面向对象特别适合于大型工程或项目的组织以及团队的分工合作 我们借助scala可以非常优雅的构造出各种规 ...
- 使用Cache缓存
存放位置:服务器内存,用于频繁访问且不轻易更改的内容缓存. string CacheKey = "CT1"; //检索指定项, object objModel = Cache.Ge ...
- ProtocolBuffer 使用及 一些坑
Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. ProtocolBuffer的优势 跨平台: Prot ...
- C/C++杂记:NULL与0的区别、nullptr的来历
某些时候,我们需要将指针赋值为空指针,以防止野指针. 有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. 也有人直接使用0值作为空指针常量,例如:int* p = 0;. ...
- centos7连接阿里云长时间连接不上
一.手动修改网卡配置 手上有几台centos7的linux,当连接阿里云的ecs服务器时候长时间连接不上,最后失败的问题. 使用 -vvv参数到如下语句就卡着不动了 ssh -vvv XXX.XXX. ...
- eclipse各种报错
1.控制台报这个错是由于tomcat的session缓存的问题; org.apache.catalina.session.StandardManager doLoad 造成原因:上次未正确关闭tomc ...
- eclipse导入/导出项目要注意三个地方
这个三个地方的jdk必须保持一致,不报错
- 洛谷P3396哈希冲突
传送门啦 非常神奇的分块大法. 这个题一看数据范围,觉得不小,但是如果我们以 $ \sqrt(x) $ 为界限,数据范围就降到了 $ x < 400 $ 我们设数组 $ f[i][j] $ 表示 ...
- eclipse中Maven项目jar问题
eclipse中Maven项目jar包下载下来了,不然我们import是时候根本导入不进来,网上的方法都试过了,Maven仓库也清空过后重新下载过了,都解决不了. 后来发现虽然jar包是下载下来了,可 ...