题意
多组样例
给定$n,m,a,b,c$,给定一个长度为$m$的数组$p[]$,给定$m$条边,构成一个$n$个点$m$条边的无向图,$Mike$想要从$a$走到$b$,再从$b$走到$c$,你可以在他从$a$出发前将$p[]$中的值分配到$m$条边上,问$Mike$最少走多少路程
分析
我们先将所有边的权值赋为$1$,意为两点间的最小边数为多少
如果$a$到$b$和$b$到$c$的最短路不重合,那就直接将两条路上的边从小到大赋值即可,问题在于有重合的部分路径
发现$\sum n\leq 2\cdot 10^5$,我们可以枚举重合的点$i$,让$Mike$走路径$a->i->b->i->c$,然后求得边数,其中$i->b$的路径为$p[]$中最小的几个元素,因为要走两遍,$i->a$和$i->c$的的路径为剩下元素中最小的元素
由于为无向图,$i$到三点距离即为三点到$i$距离,为表述方便,皆用$i$到三点表述
枚举$i$肯定不能以$i$为起点求最短路,否则时间复杂度太高,则可以以三点求最短路,然后枚举$i$
先计算$i->a$的边数,以$a$为起点,使用$Dijkstra$算法,再计算$i->b$的边数,以$b$为起点,使用$Dijkstra$算法,再计算$i->c$的边数,以$c$为起点,使用$Dijkstra$算法,其中不同的距离设为$disa[],disb[],disc[]$
因为是求路径权值和,可直接排序后计算前缀和$sum[]$
设$i->a$的路径为$disai$,$i->$的b路径为$disbi$,$i->c$的路径为$disci$,则答案为$sum[disai + disbi + disci] + sum[disbi]$的最小值(三边总的前缀和加上$i->b$的二次计算)
由于$i$到三点的路径不可能有重叠(否则取重叠点可使得答案更小),因此三条路径和小于$m$,正好使得$disai + disbi + disci$不会超出$sum[]$的范围
1 |
|