大意:给定一张M条边的无向带权图,求从起点S到终点E恰好经过K条边的最短路径。2<=M<=100,2<=K<=1000000。保证每个连边的点度至少为2.
思路:参见2008国家集训队论文day1 《矩阵乘法在信息学中的应用》俞华程。
设计一个相似的动态规划的算法:
g[i][j] = ∑g[i-1][k]·G[k][j]
其中g[i][j]表示有多少通过i条边的路径能到达点j。
同样,我们可以重新定义矩阵乘法为:
C[i][j] = min(A[i][k]·B[k][j]).(1<=k<=b)
其中 · 代表A矩阵和B矩阵进行一次Floyd求min操作。
把给定的图转换为邻接矩阵,如果i->j对应有边则赋值边权,否则赋值为无穷大,C[i][j] = min(A[i][k]·A[k][j]),对应于从i->j经过两条路径的最短路径。同理:我们只需进行K-1次操作即可得到最终的答案矩阵。
View Code
#include#include #include #include #include #include #include #include #include #include #include