图论部分技巧整理

P2149 Elaxia的路线

简化题意

给你一张无向图,给定两对起点终点 \(x_1,y_1,x_2,y_2\),要求这两对点之间最短路径的最大交集。

最短路径的交集。

这类题没见过是真想不出来…

首先众所周知的是,最短路在部分情况下不止一条,所以我们需要把所有的最短路求出来,想到 \(dijstra\)\(spfa\) 算法只能求一条最短路,但是我们可以求出所有点到起点的最短距离。

至此,我们虽然不会求所有的最短路径,但是我们可以依次判断每条边是不是在最短路径上阿!

下面给出判断方法,就是,我们可以先分别求出每个点到 \(x_1,y_1,x_2,y_2\) 的最短路长。设一条边的一个端点为 \(x\),另一个段点为 \(y\),如果 \(x\) 到起点的最短距离加上这条边的长度在加上 \(y\) 到终点的最短距离等于终点到起点的最短距离,那就说明,这条边一定在最短路径上,写成代码就是这样:

dis1[x] + z + dis3[y] == dis1[y1]

\(dis1[x]\) 表示 \(x\) 到起点的最短距离,\(dis3[y]\) 表示 \(y\) 到终点的最短距离,\(z\) 表示这条边的长度。

那现在我们会判断一条边是否在最短路路径上了,所以如果一条边同时存在于两对起点终点的最短路径上的话,那这条边就是最短路的交集喽~

P4159 迷路

题目简介

给出一张有向图,问从 1 到 n 耗时为 t 的路径有多少条。

首先,有一个显然的思路,设 \(f[i][j]\) 表示从起点到 \(i\) 这个点用 \(j\) 的时间有多少种方案。

转移的话就是 \(\sum f[x][t-1]\times f[y][1]\)

一看数据范围,\(t ≤ 10^9\),第二维状态显然无法枚举,所以这个题不可做不只是这么简单。

然后快速翻阅题解,才知道了这样一种做法。

让初始矩阵自乘 \(t\) 次,得到的矩阵每一个位置 \(G[i][j]\) 就表示从 \(i\)\(j\) 经过点数为 \(t\) 有多少种方案。

这样就是所有边的长度为 1 时的做法。

但是边的长度不止为 1。看到边长最大只有 9,这时我们考虑把边长度不止为 1 的这张图转化长边长全部为 1 的图。

考虑把每个点拆开,考虑这样一种拆法,把每个点变成 9 个点,编号 \(p_1,p_2,...,p_9\),每个点向后边连一个长度为 1 的边,如果外边的点向 p 点连边,那就是向 \(p_1\) 连一条长度为 1 的边,如果 p 点向外连边,那就是 \(p_{对应长度}\) 向外连一条长度为 1 的边。

这样说应该挺明显的了。

P2151 HH 去散步

题目简介

给定一张无向图,要求从 \(a\) 经过 \(t\) 条边到达 \(b\) 的方案数,并且走过一条路之后不能接着走这条边。

先考虑没有最后一段话,那就是构造一个矩阵,自乘 \(t\) 次,输出矩阵 \(a,b\) 位置的数字即可。

但是题目中说连续两次运动不能经过同一条路。

上面的方法是对点考虑的。把题目改一下,改成经过一个点 \(x\) 之后,到达了 \(y\) 这个点,不能接着就回到 \(x\) 点,其他条件不变,求方案数。

题目要求的东西显然与这个是一致的,从 \(x\)\(y\) 转移之后,不能再接着从 \(y\)\(x\) 转移,那就是走了 \(x->y\) 之后不能接着走 \(y->x\),这时候想到一种方法,可以把边转点,矩阵维护边的转移,那在矩阵中表示出 \(x->y\) 这条边不与 \(y->x\) 这条边相连不就好了。

posted @ 2022-09-01 19:09  zcxxxxx  阅读(72)  评论(1编辑  收藏  举报