分层图

做了三个分层图的题目,感觉自己又行了,写一下技巧吧,第一道题目是有k条免费的边,然后求最短路。

这种简单的分层图其实是不用真实的建边的,因为我们在做的时候发现每层之间的边都是有规律的,且层中的边都是有相同的,且权值都是0,利用这种特殊性,我们可以用 dp 来解决这个题目,在求最短路的时候我对每个点设置 k k k个状态,每个状态对应着该点所在的层数,在每次进行状态转移的时候,我么可以选择下一个点是否转移到下个一层。这样我们就可以不用真实的建立 k k k层图来解决这个问题了。
题目地址:最短网格

接下来的题目变得就有点难度了,之前在做这道题目的时候我还不知道分层图是什么,所以当时也没有想出来,但是现在感觉并不是多么的难,还是需要多思考,题目是牛客的题目,小雨做地铁
首先在看这道题目的时候我们就发现相同的点之间可能存在差别,什么意思呢,意思就是我们的2号线的3号点和3号线的 3号点是不一样的。这就要求我们对这些相同的点但是不同线路之间设置状态,表示点其差异,既然是这样,那么我们何不如直接利用分层图来建设关系,然后对相同点但是线路不同的点之间设置边,这里可以利用一个小技巧,技巧原型是在一个集合中,我们需要在每两个点之间都设置边,并且连向某一条点的所有权值是固定的,如果是一条一条的设置的话,我们需要设置 n 2 n^2 n2条边,这样建的边看起来有点多,这里有个技巧,就是每每一个点都向一个原点连一个权值是0 的边,然后原点再想每条边连一条权值是 w [ i ] w[i] w[i]的边。这样我们就完成了点与点之间的连边建边的数量级别就降到了线性。在这里我们选择用这个技巧在相同点不同状态的点之间连边,这样就可以愉快地AC啦,感觉有了!。

下边的题目号线是一道谷歌的题目,题目的背景也是关于地铁,这里说一下我为什么会突然的做分层图这样的题目呢,其实是因为我最近在几天一直在做地铁,在地铁上各种转线,我就突然想到了之前做过一道地铁的题目好像不会,于是入坑深似海。。

题目地址:乘坐地铁

读了下题目,和正常的地铁题目背景是一样的,但是特别的是,不同的线路之间,只有隧道相连,但是每个站点还要等车,这就提示我们是不是可以将每个站点的分成两个状态,一种是等车的状态,一种是在车上的状态,这样我们在每个合法状态之间建立关系,直接跑spfa 就完事了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值