题目描述抽象来看,是指有一个有向图,问一个点经过N条边到另一个点的最短距离(边可重复走)
为了搞这题...去研究了下矩阵乘法...我不是计算机专业~~又看了下他们的离散数学教材...有一个例子是说求两点间经过N条边到达的方案数..Mtrix67的Blog的第八题讲的也是这个问题....
首先看经过N条边方案数的这个问题...也就是理解一下这个过程...用一个邻接矩阵来存图...点 ( i , j ) 代表 i 到 j 有多少条路...最初矩阵A的初始化时( i , j ) 为两点i到j直接的边数...那么A1存的实际就是每两点只经过一条边到达的方案数...那么看一下 A^2 也就是 A*A ... 做矩阵乘法时是 MutiMtrix [ i ] [ j ] = sum ( Mtrix1 [ i ] [ k
] * Matrix2 [ k ] [ j ] ) < k=1..点数> ...那么就是说枚举所有的中间点(k) sum( A 中i到k点的方案数* A中 k 到 j 的方案数) 很明显能求出每两点之间经过两条边到达的方案数...也就是说 A^2 就代表综上...同理可证A^3代表两点之间经过3条边到达的方案数...A^k代表两点之间经过k条边到达的方案数..
理解了这个例子后再来看这道题...这道题虽然也是经过多少多少条边两点到达..但求的是最短距离...求最短距离..又联想方案数的应该和矩阵有关系..很容易能想到Floyd...Floyd在求最短路径时枚举中间点..不断更新两点两点的最短距离...回想一下Floyd的更新的方程
if (Dist [ i ] [ j ] <Dist [ i ] [ k ] + Dist [ k ] [ j ] ) Dist [ i ] [ j ] = Dist [ i ] [ k ] +Dist [ k ] [ j ]
这个表达式是不是很酷似矩阵乘法的运算式?多了一层判断再更新,把乘号变成了加号...
因为题目所给的两点最多有一条边...令一个邻接矩阵A表示两两点的初始关系...也就是题目所给的两点相连的情况..( i , j ) 是边的权值...那么( i , j )显然是 i 到 j 经过一条边最短路径长度...定义一个矩阵乘法的形式Floyd的更新方式的矩阵运算:
如果这时把 a=A b=A来做....得到的结果显然是两点到达经过两条边所需要的最短路径,运用Floyd以及求方案数的思维...为什么这个很类似Floyd的式子求出来的是确定了经过边数的最短距离?因为这个更新和Floyd不同的是更新到一个新的矩阵上去了而不是直接像Floyd的自己更新自己...所以在一更新时...不会出现自己刚更新的值又来继续更新...并且如果a,b矩阵能分辨知道是两点间几条边的最短距离..显然得到的h矩阵是经过a(其矩阵表示的经过边数)+b(其矩阵表示的经过边数)条边两点的最短距离。
这个矩阵运算的方式除了更新,形式上和矩阵乘法时一样的...所以可以运用矩阵乘法的性质来二分求解...例如如果要求 s 到 e 经过N条边到达的最短距离~~实际上是求 A 矩阵做N次后 ( s, e )的值...这里直接就看成乘法来思考..也就是求A^N这个矩阵...明显的用二分的方法来解决就可以了...Mtrix67以及我前一篇文章关于这个方法已经说得很清楚了..
这道题要注意的一点就是虽然点的标号可能是1-1000...但边最多只有100个...所以点最多也就100来个..所以要把点这里处理下~~把离散的点压成从1开始连续的好处理得多...
Program:
分享到:
相关推荐
POJ-2870 Light Up + DFS(1级DFS+1级DFS) + Python - 思维导图 链接:https://blog.csdn.net/xxdragon126/article/details/122095922?spm=1001.2014.3001.5501
北大POJ1002-487-3279【Hash+Qsort】 解题报告+AC代码
北大POJ1207-The 3n + 1 problem 解题报告+AC代码
2遍dp poj_3613解题报告 poj_3613解题报告
北大POJ2002-Squares 解题报告+AC代码
poj-1002源码,没有题解,题解看博客poj-1002源码,没有题解,题解看博客poj-1002源码,没有题解,题解看博客poj-1002源码,没有题解,题解看博客
北大POJ2240-Arbitrage【Floyd】 解题报告+AC代码
北大POJ2253-Frogger【Floyd】 解题报告+AC代码
北大POJ3009-Curling 2.0【DFS+Vector+回溯+剪枝】 解题报告+AC代码
北大POJ3414-Pots 解题报告+AC代码
非常详细的ACM 搜索类型题 配套POJ练习,有详细思路
北大POJ1159-Palindrome 解题报告+AC代码
北大POJ初级-所有题目AC代码+解题报告
北大POJ3026-Borg Maze【BFS+Prim】 解题报告+AC代码
北大POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】 解题报告+AC代码
北大POJ3733-Changing Digits【DFS+强剪枝】 解题报告+AC代码
POJ1837-Balance 解题报告+AC代码
北大POJ2503-Babelfish 解题报告+AC代码
北大POJ1201-Intervals 解题报告+AC代码
北大POJ1011-Sticks 解题报告+AC代码