[NOI2010]海拔 平面图转对偶图 最小割
题解:
首先,我们不难猜到高度只有 $0$ 或 $1$ 两种可能,而且高度为 0 的地区组成一个联通块,高度为 1 的地区组成一个联通块。只有这样,人们所耗费的体力才是最小的。
得出这个结论,题目就成了求平面图的最小割。
由于最大流等于最小割,网络流的做法是显然的,不过数据过大,不加优化是很难通过的。
我们考虑将平面图转对偶图:
我们知道平面图的最小割就等于对偶图的最短路。
本题和 bzoj1002 狼抓兔子最显著的差别就是本题的边都是有向的,而狼抓兔子的边都是无向的。
读者可以自己在草纸上画一画切割方案的 “极限” 情况,即最小割的形状是无规则的,发现对偶图中的每条边的方向恰好是原有向图的边的方向逆时针旋转 90 度。
建完图跑最短路即可。 (spfa 的话最好加一些优化)
Code:
// luogu-judger-enable-o2
#include<vector>
#include<deque>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<string>
using namespace std; typedef long long ll;
void setIO(string a){
freopen((a+".in").c_str(),"r",stdin),freopen((a+".out").c_str(),"w",stdout);
}
void end(){
fclose(stdin),fclose(stdout);
}
const int maxn=1000002;
int idx[600][600], n,s,t;
int head[maxn],to[maxn],nex[maxn],val[maxn],edges; void add_edge(int u,int v,int c){
nex[++edges]=head[u],head[u]=edges,to[edges]=v,val[edges]=c;
} long long d[maxn];
int inq[maxn];
deque<int>Q;
long long spfa()
{
memset(d,0x3f,sizeof(d));
d[s]=0,inq[s]=1;Q.push_back(s);
while(!Q.empty())
{
int u=Q.front();Q.pop_front();inq[u]=0;
for(int v=head[u];v;v=nex[v])
if(d[to[v]]>d[u]+val[v])
{
d[to[v]]=d[u]+val[v];
if(!inq[to[v]])
{
inq[to[v]]=1;
if(Q.empty()||d[Q.front()]>=d[to[v]])Q.push_front(to[v]);
else Q.push_back(to[v]);
}
}
}
return d[t];
}
int main(){
//setIO("arrangement");
scanf("%d",&n);
int cnt=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) idx[i][j]=++cnt; s=1,t=cnt+23;
int cost;
//down->up
for(int i=1;i<=n;++i) scanf("%d",&cost),add_edge(idx[1][i],t,cost);
for(int i=1;i<n;++i)
for(int j=1;j<=n;++j) scanf("%d",&cost),add_edge(idx[i+1][j],idx[i][j],cost);
for(int i=1;i<=n;++i) scanf("%d",&cost),add_edge(s,idx[n][i],cost); //left->right
for(int i=1;i<=n;++i)
{
scanf("%d",&cost),add_edge(s,idx[i][1],cost);
for(int j=1;j<n;++j)scanf("%d",&cost),add_edge(idx[i][j],idx[i][j+1],cost);
scanf("%d",&cost),add_edge(idx[i][n],t,cost);
} //up->down
for(int i=1;i<=n;++i) scanf("%d",&cost);
for(int i=1;i<n;++i)
for(int j=1;j<=n;++j)scanf("%d",&cost),add_edge(idx[i][j],idx[i+1][j],cost);
for(int i=1;i<=n;++i) scanf("%d",&cost); //right->left
for(int i=1;i<=n;++i)
{
scanf("%d",&cost);
for(int j=1;j<n;++j) scanf("%d",&cost),add_edge(idx[i][j+1],idx[i][j],cost);
scanf("%d",&cost);
}
printf("%lld",spfa());
//end();
return 0;
}
[NOI2010]海拔 平面图转对偶图 最小割的更多相关文章
- BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...
- P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)
$ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...
- BZOJ1001 狼抓兔子 平面图转对偶图 最小割
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...
- [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)
题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...
- Vijos1734 NOI2010 海拔 平面图最小割
建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring& ...
- Luogu2046 NOI2010 海拔 平面图、最小割、最短路
传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...
- 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...
- NOI 2010 海拔 ——平面图转对偶图
[题目分析] 可以知道,所有的海拔是0或1 最小割转最短路,就可以啦 SPFA被卡,只能换DIJ [代码] #include <cstdio> #include <cstring&g ...
- 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子
http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html #include<cstdio> #include<queue&g ...
随机推荐
- 新疆大学(新大)OJ xju 1009: 一带一路 prim求最短路径+O(n)素数筛选
1009: 一带一路 时间限制: 1 Sec 内存限制: 128 MB 题目描述 一带一路是去去年习大大提出来的建设“新丝绸之路经济带”和“21世纪海上丝绸之路”的战略构想.其中就包括我们新疆乌鲁木 ...
- MySQL学习(五)——使用JDBC完成用户表CRUD的操作
通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在,开发中遇到此种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用. 1.使用properties配置文件 开 ...
- e.Row.Attributes.Add
其实看到属性这个单词,还有点发憷呢,C#里面有个关键词是Attributes, 搞了半天貌似没有弄清楚 e.Row.Attributes.Add()函数的介绍,包括参数,什么是Attributes 就 ...
- C# 热敏打印机 小票打印机 打印图片
最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要调用的代码: 因为我们这里主要是打印条形码和二维码,所以以条形码和二维 ...
- SpringCloud学习笔记(7)----Spring Cloud Netflix之负载均衡-Ribbon的深入理解
1. 注解@LoadBalanced 作用:识别应用名称,并进行负载均衡. 2. 入口类:LoadBalancerAutoConfiguration 说明:类头上的注解可以知道Ribbon 实现的负载 ...
- javaweb集成swagger
一.添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-sw ...
- jquery 取页面中ifram中得节点
<iframe src="html/bai.jsp" frameBorder=0 id=middle name=middle scrolling="yes" ...
- 大O时间复杂度
大O表示法指出了在最糟情况下的运行时间.比较操作数,指出了算法运行时间的增速 常见的大O运行时间 O(logn):也叫对数时间,包括二分查找 O(n):也叫线性时间,包括简单查找 O(nlogn):包 ...
- WPF 一个空的 WPF 程序有多少个窗口
原文:WPF 一个空的 WPF 程序有多少个窗口 好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口 在 WPF 内部 ...
- Ubuntu ctrl+alt会导致窗口还原的问题
Ubuntu ctrl+alt会导致窗口还原的问题 本来以为是compizConfig的问题,后来在系统config中找到键盘>快捷键:恢复窗口,删除这个快捷键,就好了: 原来这里写的是ctrl ...