(待添加更多的题及笔记整理)【图论】分层图

分层图是一种解决单源最短路径问题的策略,通过构建多层图并限定路径转移,来寻找权值可缩短的路径。建边过程是理解分层图的关键,需要注意数组范围。典型题目包括洛谷P4822、P4568和P2939,这些题目考察了Dijkstra算法和分层图的结合运用。
摘要由CSDN通过智能技术生成

 知识点


分层图用于求在单源最短路径中,建立多层相同或相似的图, 并在图与图之间进行连边,可以实现 两种性质的图 之间的 转移,或是 图与图 之间 有限制的转移。换句话说,就是求图中存在 k 条可缩短的路径或边权可为 0 的路径最值问题。

因为对于原图的 n 个点来说,都可以选择下一条边是否赋予权值为0,或使权值缩小,那么我们可以将图画出k+1层。

个人觉得分层图最难理解的,就是建边的过程。

建边核心代码:

for(register int i = 1;i <= m;++ i)
{
	int x,y,z;
	cin >> x >> y >> z;
	add(x,y,z),add(y,x,z);
	for(register int j = 1;j <= k;++ j)
	{
                   //将其他图对应的边连接起来
		add(j * n + x,j * n + y,z);
		add(j * n + y,j * n + x,z);
                //两张图的连接点,即可以改变的值,可能为0,也可能为n/2等边权
		add((j - 1) * n + x,j * n + y,0);
		add((j - 1) * n + y,j * n + x,0);
	}
}

!!注意:每建一层图,对应的点的位置需要向后移动n个,需要特别注意 数组范围 


模板题:

1 . 洛谷 P4822 [BJWC2012]冻结

思路:其实在题目中就已经点明这是一道求单源最短路径的题目,最保险的算法就是Dijkstra + 优先队列。在建图的部分能体现分层图,将上下两层之间连上正常边的权值一半大小的边即可,该题的难点就在于分层图的建边。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int n,m,k;
const int maxn=1e7+5,INF=0x3f3f3f3f;
struct node{
	int to,next,w;
}edge[maxn<<1];
int head[maxn],num=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值