信息学奥赛一本通 1345:【例4-6】香甜的黄油
【题目考点】
1. 图论 最短路径
【解题思路】
将题目叙述转为图论概念,牧场为顶点,牧场间的路线为边。该题一个顶点上有多头牛,这个后面再考虑。
记有V个顶点,E条边,有n头牛,每头牛所在顶点为v 1 , v 2 , . . . v n v_1,v_2,...v_nv
1
,v
2
,...v
n
,d ( i , j ) d(i,j)d(i,j)为顶点i,j间的最短路径长度。
题目要问的问题是,选择一个顶点c,使得∑ i = 1 n d ( v i , c ) \sum_{i=1}^nd(v_i,c)∑
i=1
n
d(v
i
,c)最小。
如果已知每头牛所在顶点到其它任意顶点的最短路径长度,那么接下来就可以遍历所有顶点,记遍历到的顶点为i,选择顶点i为放糖的地方,求所有牛所在顶点到顶点i的最短路径加和,这一步的复杂度为O ( V ⋅ n ) O(V\cdot n)O(V⋅n)
问题落在如何求每头牛所在顶点到其它任意顶点的最短路径。
使用Floyd算法,求所有顶点间的最短路径长度。题目给定顶点数(牧场数)最大为800,Floyd算法的复杂度为O ( V 3 ) O(V^3)O(V
3
),80 0 3 = 5.12 ∗ 1 0 8 800^3=5.12*10^8800
3
=5.12∗10
8
,运算次数在1 0 7 10^710
7
以下可以保证不会超时,复杂度达到1 0 8 10^810
8
数量级很可能会超时,所以不能用Floyd算法。
如果用单源最短路径算法,需要对每头牛所在顶点跑一次单源最短路径算法。算法整体复杂度为:O ( n ) O(n)O(n)乘以所用的单源最短路径算法的复杂度。
考虑使用朴素Dijkstra算法,整体复杂度为O ( n ⋅ V 2 ) O(n\cdot V^2)O(n⋅V
2
),计算500 ∗ 80 0 2 = 3.2 ∗ 1 0 8 500*800^2=3.2*10^8500∗800
2
=3.2∗10
8
,不可行。
使用Dijkstra堆优化算法,整体复杂度为O ( n ⋅ E l o g E ) O(n\cdot ElogE)O