首页 > 其他分享 >Luogu2046 海拔 - 网络流 - 最短路 -

Luogu2046 海拔 - 网络流 - 最短路 -

时间:2022-11-22 19:44:43浏览次数:83  
标签:x1 idx int 短路 网络 x2 y1 Luogu2046 y2

题目链接:https://www.luogu.com.cn/problem/P2046

首先观察可以发现最优解一定是左上部分是全0,右下是全1这样的形式
然后题目就相当于让我们求一个 \((1,1) \rightarrow (n+1,n+1)\) 的最小割
由于这是网格图(属于平面图)。平面图最小割 = 对偶图最短路
于是转化成对偶图求最短路,那么如何建图呢?
我们不妨把前n行前n列抽出来,然后用一个矩形左上角的那个点的坐标记为这个矩形的坐标。这样我们就表示出了 \(n \times n\) 个小矩形
然后边有4种,这里取 \(A \rightarrow B\) 和 \(C \rightarrow D\) 为例

\(A \rightarrow B\):这里是从东往西走,注意这个割对应的最短路一定是从右上往左下走的,所以 A->B 对应的鸽就是从下往上的了,也就是说,如果 \(B(i,j) ,A(i,j+1)\) 那么建图的时候就是下格子(坐标为B点坐标)\((i,j)\) 连向上格子(坐标为A点坐标都减去1) \((i-1,j+1-1) = (i-1,j)\)

\(C \rightarrow D\)同理。这里是从南往北走,对应的割的路线是左往右,也就是说 \(D(i,j)\) \(C(i+1,j)\),则连边为 \((i+1-1,j-1)=(i,j-1) \rightarrow (i,j)\)

建图之后跑一个最短路就行了

// by SkyRainWind
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define pii pair<int,int>

using namespace std;

typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 3e5 + 5;

int n, s, t;
vector<pii>g[maxn];

int idx(int p,int q){return (p-1)*(n+1) + q;}
void add(int x,int y,int v){g[x].push_back(mpr(y,v));}

void add1(int x1,int y1,int x2,int y2,int v){
	if(x1 == 0){
		add(s,idx(x2,y2),v);
		return ;
	}
	if(x2 == n+1){
		add(idx(x1,y1),t,v);
		return ;
	}
	add(idx(x1,y1), idx(x2,y2), v);
}

void add2(int x1,int y1,int x2,int y2,int v){
	if(x1 == n+1){
		add(t,idx(x2,y2),v);
		return ;
	}
	if(x2 == 0){
		add(idx(x1,y1),s,v);
		return ;
	}
	add(idx(x1,y1), idx(x2,y2), v);
}

void add3(int x1,int y1,int x2,int y2,int v){
	if(y2 == 0){
		add(idx(x1,y1),t,v);
		return ;
	}
	if(y1 == n+1){
		add(s,idx(x2,y2),v);
		return ;
	}
	add(idx(x1,y1), idx(x2,y2), v);
}

void add4(int x1,int y1,int x2,int y2,int v){
//	debug();
	if(y1 == 0){
		add(t,idx(x2,y2),v);
		return ;
	}
	if(y2 == n+1){
		add(idx(x1,y1),s,v);
		return ;
	}
	add(idx(x1,y1), idx(x2,y2), v);
}

struct iedges{int val,num;bool operator<(const iedges a)const{return a.val<val;}iedges(){}iedges(int vv,int nu):val(vv),num(nu){}};
priority_queue<iedges>pq;

int vis[maxn],dis[maxn];
void dijkstra(int be){
	int N=(n+1)*(n+1)+3;
	for(int i=1;i<=N;i++)dis[i]=inf;
	dis[be]=0;
	
	pq.push(iedges(0,be));
	while(!pq.empty()){
		int fr=pq.top().num;pq.pop();
		if(vis[fr])continue;
		vis[fr]=1; 
		for(pii now : g[fr]){
			int u=now.first,v=now.second;
			if(dis[fr]+v<dis[u]){
				dis[u]=dis[fr]+v;
				pq.push(iedges(dis[u],u));
			}
		}
	}
	
	printf("%d\n",dis[t]);
}

signed main(){
	scanf("%d",&n);
	s = (n+1) * (n+1) + 1; t = s + 1;
	for(int i=1;i<=n+1;i++){	// w -> e
		for(int j=1;j<=(n);j++){
			int v;scanf("%d",&v);
			// (i,j) -> (i,j+1)  dual (i-1,j) -> (i,j)
			add1(i-1,j,i,j,v);
		}
	}
	for(int i=1;i<=n;i++){	// n -> s
		for(int j=1;j<=n+1;j++){
			int v;scanf("%d",&v);
			// (i,j) -> (i+1,j) dual (i,j) -> (i,j-1)
			add3(i,j,i,j-1,v);
		}
	}
	for(int i=1;i<=n+1;i++){	// e -> w
		for(int j=1;j<=(n);j++){
			int v;scanf("%d",&v);
			// (i,j+1) -> (i,j)  dual (i,j) -> (i-1,j)
			add2(i,j,i-1,j,v);
		}
	}
	for(int i=1;i<=n;i++){	// s -> n
		for(int j=1;j<=n+1;j++){
			int v;scanf("%d",&v);
			// (i+1,j) -> (i,j) dual (i,j-1) -> (i,j)
			add4(i,j-1,i,j,v);
//			debug();
		}
	}
	dijkstra(s);

	return 0;
}

标签:x1,idx,int,短路,网络,x2,y1,Luogu2046,y2
From: https://www.cnblogs.com/SkyRainWind/p/16916214.html

相关文章

  • vue2 axios11 await async 解构赋值 原生axios发起网络请求
    axios:专注发起网络请求的库get传参要params,post传参用data,具体传参看后端怎么写,后端乱写就套麻袋打一顿   post请求简化版:不用await和async时是一个prom......
  • 网络流学习笔记
    前言:本人已做完网络流24题。0.基础:Dinic最大流/最小割:https://www.luogu.com.cn/blog/creationhy/dinicDinic费用流:https://www.luogu.com.cn/blog/creationhy/dinic-f......
  • 【网络编程】Unity中使用Socket编程
    基本介绍名词解释Socket:网络连接的一端被称为socket。一个socket包含以下五个元素:使用的协议、本机IP、本地端口、远程IP、远程端口。IP地址:每台电脑都有一个自己的IP地址。......
  • Kraken:最大,最坏的僵尸网络
    Kraken:Thebiggest,baddestbotnetyetKraken:最大,最坏的僵尸网络《endurer注:1。Kraken:相传在挪威海中出现的怪物。详见:​​http://en.wikipedia.org/wiki/Kraken​​》......
  • Java实现网络爬虫 案例代码
    Java实现网络爬虫案例代码需求说明搭建开发环境,实现《三国演义》全文保存在本地 步骤分析访问网址:http://www.shicimingju.com/book/sanguoyanyi.html分析网站URL......
  • Java 网络编程(五)TCP
    客户端1.连接服务器socket2.发送消息//客户端publicclassTcpClientDemo01{publicstaticvoidmain(String[]args){Socketsocket=null......
  • Java 网络编程(四)通信协议
    协议:约定,就好比我们现在说的是普通话网络通信协议:速率,传输码率,代码结构,传输控制......TCP/IP协议簇实际上是一组协议重要:1.TCP:用户传输协议2.UDP:用户数......
  • 从LeNet-5看懂卷积神经网络结构
    LeNet-5出自论文Gradient-BasedLearningAppliedtoDocumentRecognition,是一种用于手写体字符识别的非常高效的卷积神经网络。论文下载一、卷积神经网络(ConvolutionalN......
  • 网络层IP
    1.概述2.ip的包头结构version:表示版本HeaderLength:固定字段,永远是20TotalLength:20+上层的数据3.分片当数据包比链路MTU大的时候,就会被分解成很多足......
  • 2863. 最短路
    题目链接2863.最短路给一个\(N\)个点\(M\)条边的仙人掌。仙人掌定义如下:任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。有\(Q\)组询问,每次询问......