今天写了第一个floyd...感觉...收获颇多~说说这个函数....
map[2][][]是一张地图,map[0][][]记录了各个点之间的距离,其中,某个顶点到自身的距离为0,如果两个点之间没有路径,则距离为无穷大。
然后就开始一层一层dp了,这里直接对k用2取余,两个二维数组就够了,省空间阿。
还有一点问题要注意,判断map[(k-1)%2][t][tt]和map[(k-1)%2][k-1][tt]+map[(k-1)%2][t][k-1])大小的时候没有直接比较,因为如果两个加数都是无穷大的话必然就会溢出了。所以变通了一下~记住,还是很有用的。
差不多了吧......
void floyd()
{
int k,t,tt;
for(k=1;k<=N;k++)
for(t=0;t<N;t++)
for(tt=0;tt<N;tt++)
{
if(map[(k-1)%2][t][tt]-map[(k-1)%2][k-1][tt]<map[(k-1)%2][t][k-1])
map[k%2][t][tt]=map[(k-1)%2][t][tt];
else
map[k%2][t][tt]=map[(k-1)%2][t][k-1]+map[(k-1)%2][k-1][tt];
}
}
=============2008.5.25修改========================
嗯..不对...在poj上用这种方法做题要么wa要么re,问了一下,只要一个二维数组就可以了。因为dp的时候始终是在取最优,所以不用担心。如下:
for(k=1;k<=N;k++)
for(t=0;t<N;t++)
for(tt=0;tt<N;tt++)
{
if(map[t][tt] > map[k-1][tt] + map[t][k-1])
map[t][tt] = map[k-1][tt] * map[t][k-1];
}
还有就是,学习这些图论的算法要注意变通、灵活使用。有时候是最长路径,有时候是最短路径,有时候是所有路径中最长的,有时候是所有中最短的,总之,要看准了在用算法。