luogu2046[NOI2010]海拔 对偶图优化
luogu2046[NOI2010]海拔 对偶图优化
链接
https://www.luogu.org/problemnew/show/P2046
思路
海拔一定是0或者1,而且会有一条01交错的分界线。
转化为最小割,用对偶图优化求得。最小割论文写的特清楚。
代码
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=2e6+7,inf=0x3f3f3f3f;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,S,T;
struct edge {
int v,nxt,q;
}e[N*5];
int head[N*5],tot;
void add(int u,int v,int q) {
// cout<<u<<" "<<v<<"\n";
e[++tot].v=v;
e[tot].q=q;
e[tot].nxt=head[u];
head[u]=tot;
}
struct node {
int x,y;
bool operator < (const node &b) const {
return x>b.x;
}
};
priority_queue<node> q;
int dis[N];
void dij() {
memset(dis,0x3f,sizeof(dis));
q.push((node){0,S});
dis[S]=0;
while(!q.empty()) {
node u=q.top();
q.pop();
if(u.x!=dis[u.y]) continue;
// cout<<head[S]<<" "<<<<"\n";
for(int i=head[u.y];i;i=e[i].nxt) {
int v=e[i].v;
// cout<<u.y<<" -> "<<v<<" "<<e[i].q<<"\n";
if(dis[v]>dis[u.y]+e[i].q) {
dis[v]=dis[u.y]+e[i].q;
q.push((node){dis[v],v});
}
}
}
}
int main() {
// freopen("testdata.in","r",stdin);
n=read();
S=n*n*2+1,T=n*n*2+2;
for(int i=1,x,TX,TY;i<=n+1;++i) {
for(int j=1;j<=n;++j) {
x=read();
TX=(i-1)*n+j-n,TY=(i-1)*n+j;
if(i==1) TX=S;
if(i==n+1) TY=T;
add(TX,TY,x);
}
}
for(int i=1,x,TX,TY;i<=n;++i) {
for(int j=1;j<=n+1;++j) {
x=read();
TX=(i-1)*n+j-1,TY=(i-1)*n+j;
if(j==1) TX=T;
if(j==n+1) TY=S;
add(TY,TX,x);
}
}
for(int i=1,x,TX,TY;i<=n+1;++i) {
for(int j=1;j<=n;++j) {
x=read();
TX=(i-1)*n+j-n,TY=(i-1)*n+j;
if(i==1) TX=S;
if(i==n+1) TY=T;
swap(TX,TY);
add(TX,TY,x);
}
}
for(int i=1,x,TX,TY;i<=n;++i) {
for(int j=1;j<=n+1;++j) {
x=read();
TX=(i-1)*n+j-1,TY=(i-1)*n+j;
if(j==1) TX=T;
if(j==n+1) TY=S;
swap(TX,TY);
add(TY,TX,x);
}
}
dij();
printf("%d\n",dis[T]);
return 0;
}
luogu2046[NOI2010]海拔 对偶图优化的更多相关文章
- bzoj2007 NOI2010 海拔(对偶图)
80分(最小割)思路 先考虑如果没有题目中东南角为\(1\)那个限制的话会怎样. 那么只要让每个点的海拔都是\(0\)就行了.这样不论怎样走,最后的答案都是0. 然后再考虑那个东南角为\(1\)的限制 ...
- 【BZOJ2007】[Noi2010]海拔 对偶图最短路
[BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...
- Luogu2046 NOI2010 海拔 平面图、最小割、最短路
传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...
- [BZOJ2007][NOI2010]海拔(对偶图最短路)
首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...
- B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...
- 图论(对偶图):COGS 470. [NOI2010]海拔
470. [NOI2010]海拔 ★★★☆ 输入文件:altitude.in 输出文件:altitude.out 简单对比 时间限制:2 s 内存限制:512 MB 海拔 [问题描述] ...
- 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2504 Solved: 1195 Description YT市 ...
- BZOJ 2007: [Noi2010]海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2410 Solved: 1142[Submit][Status] ...
- NOI2010海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1302 Solved: 612[Submit][Status] ...
随机推荐
- HTML <script> 标签的 defer 和 async 属性
HTMKL <script>标签中有defer和async属性,简单介绍一下两者的区别吧. 普通的script标签会让浏览器立即下载并执行完毕,执行也是按照先后顺序,再进行后面的解析. ...
- docker 打卡
create 2019/01/01 mod 2019/02/02 安装没得技术含量,看过菜鸟教程和纯洁写的博客,感觉so easy 命令: yum install docker 启动 设置开机启动 s ...
- HDU_5528_Count a * b
Count a * b Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tot ...
- Java Web请求和响应机制
1.请求响应流程图 =================== 服务器处理请求的流程: 服务器每次收到请求时,都会为这个请求开辟一个新的线程. 服务器会把客户端的请求数据封装到request对象中,req ...
- C/S和B/S的应用的区别
C/S: C是指Client,S是指Server.C/S模式就是指客户端/服务器模式.通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销. ...
- python_打包成exe
1. 安装pyinstaller pip install pyinstaller 或通过国内镜像下载(较快): pip install pyinstaller -i http://pypi.douba ...
- HTML轮播图实现(前后端分离)
1,首先前后端分离用到了3个插件 2,异步请求后端获取数据库图片地址(图片名字) //图片轮播 axios({ url:'http://127.0.0.1:8000/userctrl/image', ...
- office 2016密钥
Office 2016 Pro Plus Retail 版激活密钥:[Key]:3XJTG-YNBMY-TBH9M-CWB2Y-YWRHH[Key]:6TCQ3-NBBJ2-RTJCM-HFRKV-G ...
- 5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换
1.前言 首先我们想一下,如果在 Android 中实现 布局切换,通常的思路是: 做一个 viewpager 一组 Fragment 每个 Fragment 绑定一个 xml 最后填充至 viewp ...
- python框架之Flask(1)-Flask初使用
Flask是一个基于 Python 开发并且依赖 jinja2 模板和 Werkzeug WSGI 服务的一个微型框架,对于 Werkzeug 本质是 Socket 服务端,其用于接收 http 请求 ...