首页 > 其他分享 >平面图与对偶图

平面图与对偶图

时间:2025-01-17 18:06:17浏览次数:1  
标签:idx get int 平面图 heap 对偶

平面图:如果能把图\(G\)画在平面上,使得除顶点外,边与边没有交叉,则称\(G\)可以嵌入平面,或称\(G\)为可平面图。可平面图\(G\)的一种边不交叉的画法,称为\(G\)的一种平面嵌入,\(G\)的平面嵌入表示的图称为平面图。
对偶图:对偶图是伴随平面图的一张图,具体来说就是把平面图里的每个面当成一个节点,这些节点之间的边是和原图的边相交的,对偶图边的权值等于原平面图边的权值。
形式化来说:设平面图为\(G\),其对偶图为\(G^{'}\),对于原图中每条边\(e\):
\(1\):若\(e\)在平面图中属于两个平面\(f_1,f_2\),则在对偶图中连边\((f_1^{'},f_2^{'})\)。
\(2\):若\(e\)在平面图中属于一个平面\(f_1\),则在对偶图中连自环\((f_1^{'},f_1^{'})\)。
有如下定理:平面图的最小割等于其对偶图的最短路。
所以当遇到平面图最小割问题时,若点数过多,导致网络流算法不易通过时,可考虑刻画出此平面图的对偶图,并在对偶图上跑最短路即可。
通过如下几道例题来深入理解:
\(P2046\)
https://www.luogu.com.cn/problem/P2046
题解:引理\(1\):将所有海拔赋为\(0\)或\(1\)是最优的。
证明:每次选择海拔绝对值最大的点集,若绝对值大于\(1\),则将点集中所有点海拔根据正负加减\(1\),这样一定不会变劣。如此进行下去,直到图中只有海拔为\(0\)和\(1\)的点。
引理\(2\):最终图一定由一个海拔为\(0\)的连通块和一个海拔为\(1\)的连通块构成。
证明:如果连通块个数\(>2\),则一定有一个连通块被完全包围,将这个被完全包围的连通块改变海拔,这样一定不会变劣。如此进行下去,直到图中只有两个连通块。
考虑这两个连通块代表的权值,正是这个平面图的一个割,但由于此图的点数过多,常规的网络流算法并不能通过。
考虑将平面图转化为对偶图。具体来说,先将起点和终点连上一条虚拟边,这样新增了一个面。令新增的这个面为\(S\),剩余那个无穷大的面为\(T\),按照平面图转对偶图的方式连边,发现新图中\(S\)到\(T\)的任何一条路径,都完成了对原图的一个分割,同时将原图中的\(s\)和\(t\)分割到两个集合中,并且路径长度,即为原图割的大小,于是直接在新建的对偶图中求\(S\)到\(T\)的最短路即可。

#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> PII;
const int N=510,M=2e6+10;

int n,S,T;
int d[M];
int h[M],e[M],w[M],ne[M],idx;
int dl[N][N],dr[N][N],du[N][N],dd[N][N];
bool st[M];

int get(int x,int y){
	return (x-1)*n+y;
}

void add(int a,int b,int c){
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int dijkstra(){
	memset(d,0x3f,sizeof d);
	priority_queue<PII,vector<PII>,greater<PII> > heap;
	d[S]=0,heap.push({d[S],S});
	while(heap.size()){
		int t=heap.top().second;
		heap.pop();
		if(st[t]) continue;
		st[t]=1;
		for(int i=h[t]; i!=-1; i=ne[i]){
			int j=e[i];
			if(st[j]) continue;
			if(d[t]+w[i]<d[j]){
				d[j]=d[t]+w[i];
				heap.push({d[j],j});
			}
		}
	}
	return d[T];
}

int main(){
	memset(h,-1,sizeof h);
	cin >> n;
	for(int i=1; i<=n+1; i++)
		for(int j=1; j<=n; j++) cin >> dr[i][j];
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n+1; j++) cin >> dd[i][j];
	for(int i=1; i<=n+1; i++)
		for(int j=1; j<=n; j++) cin >> dl[i][j];
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n+1; j++) cin >> du[i][j];
	S=n*n+1,T=n*n+2;
	for(int i=1; i<=n; i++) add(S,get(i,1),dd[i][1]);
	for(int i=1; i<=n; i++) add(get(i,n),T,dd[i][n+1]);
	for(int i=1; i<=n; i++) add(S,get(n,i),dr[n+1][i]);
	for(int i=1; i<=n; i++) add(get(1,i),T,dr[1][i]);
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n-1; j++) add(get(i,j),get(i,j+1),dd[i][j+1]);
	for(int i=1; i<=n; i++)
		for(int j=2; j<=n; j++) add(get(i,j),get(i,j-1),du[i][j]);
	for(int i=1; i<=n-1; i++)
		for(int j=1; j<=n; j++) add(get(i,j),get(i+1,j),dl[i+1][j]);
	for(int i=2; i<=n; i++)
		for(int j=1; j<=n; j++) add(get(i,j),get(i-1,j),dr[i][j]);
	cout << dijkstra() << endl;
	return 0;
}

\(P4001\)
https://www.luogu.com.cn/problem/P4001
题解:同样发现所求的即为最小分割,仿照上一题做法即可。

#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> PII;
const int N=5e6+10;

int n,m,S,T;
int d[N];
int h[N],e[N],w[N],ne[N],idx;
bool st[N];

int get(int x,int y){
	if(x>n-1||y<1) return S;
	if(x<1||y>2*(m-1)) return T;
	return (x-1)*2*(m-1)+y;
}

void add(int a,int b,int c){
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int dijkstra(){
	memset(d,0x3f,sizeof d);
	priority_queue<PII,vector<PII>,greater<PII> > heap;
	d[S]=0,heap.push({d[S],S});
	while(heap.size()){
		int t=heap.top().second;
		heap.pop();
		if(st[t]) continue;
		st[t]=1;
		for(int i=h[t]; i!=-1; i=ne[i]){
			int j=e[i];
			if(st[j]) continue;
			if(d[t]+w[i]<d[j]){
				d[j]=d[t]+w[i];
				heap.push({d[j],j});
			}
		}
	}
	return d[T];
}

int main(){
	memset(h,-1,sizeof h);
	cin >> n >> m;
	S=(n-1)*2*(m-1)+1,T=(n-1)*2*(m-1)+2;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m-1; j++){
			int v;
			cin >> v;
			if(i>=2&&i<=n-1) add(get(i-1,2*j-1),get(i,2*j),v);
			add(get(i,2*j),get(i-1,2*j-1),v);
		}
	for(int i=1; i<=n-1; i++)
		for(int j=1; j<=m; j++){
			int v;
			cin >> v;
			add(get(i,2*(j-1)),get(i,2*(j-1)+1),v);
			if(j>=2&&j<=m-1) add(get(i,2*(j-1)+1),get(i,2*(j-1)),v);
		}
	for(int i=1; i<=n-1; i++)
		for(int j=1; j<=m-1; j++){
			int v;
			cin >> v;
			add(get(i,2*j-1),get(i,2*j),v);
			add(get(i,2*j),get(i,2*j-1),v);
		}
	cout << dijkstra() << endl;
	return 0;
}

标签:idx,get,int,平面图,heap,对偶
From: https://www.cnblogs.com/lastxuans/p/18677130

相关文章

  • 统计学习方法(第二版) 第七章 拉格朗日对偶性
            在约束最优化问题中,常常利用拉格朗日对偶性(Lagrangeduality)将原始问题转换为对偶问题,通过解对偶问题而得到原始问题的解。该方法应用在许多统计学习方法中,例如,最大熵模型与支持向量机。这里简要叙述拉格朗日对偶性的主要概念和结果。    这里就......
  • 线性规划对偶小记
    有\(n\)个变量\(x_1,x_2,\dots,x_n\),有若干条限制,形如:\(f(x_1,x_2,\dots,x_n)\leb\)\(f(x_1,x_2,\dots,x_n)=b\)\(f(x_1,x_2,\dots,x_n)\geb\)三种不同形式(注意不能取小于或大于号),可称这些限制是线性的。同时,需要最大化\(\sum\limits_{i=1}^......
  • 平面图最小割
    参考(准确来说差不多是转载):https://blog.csdn.net/m0_51780913/article/details/122410037(平面图最小割)https://www.cnblogs.com/alex-wei/p/basic_graph_theory.html中的平面图最小割部分(只说了网格图最小割)基础定义平面图:能画在平面上,满足除顶点处以外无边相交的图称为......
  • 对偶空间
    对偶空间对于域\(F\)上线性空间\(V\),\(V\)上的线性函数指的是映射\(f\colonV\rightarrowF\),满足对于任意\(u,v\inV,\alpha,\beta\inF\),\[f(\alphau+\betav)=\alphaf(u)+\betaf(v)\]\(V\)上线性函数的集合用我们熟知的记号可表示为\(\hom(V,F)\),此时我们将其记......
  • 运筹学笔记——对偶线性规划问题
    上一章节的线性规划学习基本完成,进入下一章对偶问题的学习(部分笔记以及实例从书上摘录,仅供复习参考)一、情景引入某厂在计划期内要安排生产1、2两种产品,需要用到劳动力设备以及A和B两种原材料。期望生产两种产品得到最大利润产品1产品2资源限额劳动力84360工时设备45200台......
  • 补充章 平面图形的几何性质
    §A.1静矩和形心※定义图形对x和y轴的静矩静矩关于(x)和(y)轴的定义:\[S_y=\int_Ax\,dA,\quadS_x=\int_Ay\,dA\]形心公式:\[\bar{x}=\frac{S_y}{A},\quad\bar{y}=\frac{S_x}{A}\]※特性1.静矩的量纲:[l长度]³2.静矩的值可为正、负、或零3.一......
  • 对偶单纯形法算法精要
    单纯形法是线性规划中最经典且广泛应用的求解方法,通过在可行解的边界上移动,逐步逼近最优解。它从一个初始基本可行解开始,不断优化目标函数值,直到找到最优解。对偶单纯形法则是单纯形法的一种变形,尤其适用于特定类型的线性规划问题。不同于标准的单纯形法,对偶单纯形法从一个对偶可......
  • (未完工)Contest7516 - 平面图
    Contest笔记欧拉定理欧拉定理连通平面图满足\(V-E+F=2\)。有\(C\)个连通块的平面图满足\(V-E+F=C+1\)。简单连通平面图满足\(E\le3V-6\)。重要:平面图满足\(E=O(V)\)。可以用于证明\(K_5\)不是平面图。一个\(V\ge3\)的简单连通平......
  • D39 2-SAT P3209 [HNOI2010] 平面图判定
    视频链接:D392-SATP3209[HNOI2010]平面图判定_哔哩哔哩_bilibili   图论(十三)——平面图和对偶图_图论(十三)——平面图和对偶图-CSDN博客P3209[HNOI2010]平面图判定-洛谷|计算机科学教育新生态(luogu.com.cn)#include<iostream>#include<cstring>#incl......
  • 线性规划对偶与网络流
    线性规划对偶与网络流1https://ac.nowcoder.com/acm/contest/81598/KK-SlaytheSpire:GameDesign题目大意给定一个\(n\)个点\(m\)条边的有向无环图\(G=(V,E)\)以及一个整数\(k\),其中所有无入度的点为源点,所有无出度的点为汇点。要求选择最少数量的非源点和......