题目见:
http://www.ruvtex.cn/cogs/problem/pdetail.php?pid=15
这个题让我对floyd有了一个更好的认识。
floyd实际上是一个动态规划的过程。对于这个利用松弛进行的动态规划,我们能从中得到很多其他的信息。首先,如果说一个两个点之间的松弛点式确定的,那么我们就可以确定两点间的一条最短路径。还可以进行floyd找最小环的工作。
这个题目就是利用floyd进行的一个计数的动态规划。我们知道,对于两点和他们最短路上的一个点来说,这两点最短路的个数就是起点到这个点最短路的个数和这个点到终点的最短路个数的乘积。那么对于这道题来说,我们在求最短路的过程中不断地更新这个值就好。
dis[i,j]表示i,j最短路径。floyd进行松弛,如果可以松弛,那么用count[i,j]记录I,j最短路的个数。count[i,j]:=count[i,k]*count[k,j]。
如果说他刚好就是另一条最短路,就是满足dis[i,j]=dis[i,k]+dis[k,j]那么就有count[i,j]:=count[i,j]+count[i,k]+count[k,j]。
然后根据题目要求统计求解就可以了。
P.S. 现在终于体会到wangsincos大牛给我的启发…………无穷大不能用maxlongint,要自己设。否则,…………有可能会搞到负数那里去~~