学习笔记——分层图

分层图

刚听到这个思想的时候,蒟蒻实际上是被唬住了,后来学懂了发现

不过如此啊!!!

原blog

分层图求最短路

分层图的引入问题是这样的:

假设你要从图中的A点走到B点,并且你有k次机会免费走过某条边,那么请问最短路有多大?

这个问题可以拿动态规划解决,不过我们先看如何用分层图解决这个问题。

我们建k+1层图。然后有边的两个点,多建一条到下一层边权为0的单向边,如果走了这条边就表示用了一次机会。

对于数据:

n = 4,m = 3, k = 2

0 1 100

1 2 100

2 3 100

如下图
在这里插入图片描述
这个分层图共有k+1层n(k+1)个节点,我们只需要对这个分层图跑一遍最短路,输出3,3+n,3+2n,3+3n最小的值就可以了。

其他的问题都可由这个问题转化得到思路

动态规划求解

这里只是简单提一句动态规划,我们可以把dis与vis数组再开一维表示用了几次机会

dis[ i ][ j ] 代表到达 i 用了 j 次免费机会的最小花费.
vis[ i ][ j ] 代表到达 i 用了 j 次免费机会的情况是否出现过.

那么
不使用机会 dis[v][c] = min(min,dis[now][c] + edge[i].w);
使用机会 dis[v][c+1] = min(dis[v][c+1],dis[now][c]);

例题
Luogu P4568

Luogu P2939

Luogu P4822

上面都是裸的分层图

Luogu P3953
就是这道题吸引我学分层图的!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值