【图论】最短路

常见技巧:
新建超级源点:例如求到达一个点集中的任意一个点的最短路,就把这个点集的点都从一个超级源点连出
分层图最短路:给最短路多带上一个属性(例如使用某个优惠条件/加倍条件k次,有时候可以提前使用或者存储起来以后使用某个条件)

同余最短路:给n个整数a1,a2,an,求他们不能线性组合出的[lim1,lim2]中的最小/最大的整数:取出最小值amin,然后求i \in[0,amin),是否存在一个值x使得 x=k*amin + i ,假如存在,那么这个最小的x是多少,这样可以变回最短路的问题。

松弛操作:若使用ai松弛后没有越界,则使用ai对这些值进行松弛:dis[(u+ai)%amin]=min(dis[(u+ai)%amin],dis[u]+ai)

两点S、T之间的最短路的可经点:

对S和T分别求一次单源最短路。如果disS[i] + disT[i] == disS[T] 则i是可经点。

同理,如果某条边uvw满足 disS[u] + disT[v] + w = disS[T] 或者 disS[v] + disT[u] + w = disS[T] 则这条边是可经边。

上面是对于无向图的做法,对于有向图要区分从T开始求单源最短路时用到的边是和从S开始的时候不一样的。

到达某点的不同的最短路的方案数

如果某边松弛成功,则 dis[v] = dis[u] + w , cnt[v] = cnt[u],如果某边是相等的,无法松弛,那就是cnt[v]+=cnt[u]。

posted @ 2021-02-10 02:58  purinliang  阅读(53)  评论(0编辑  收藏  举报