floy小总结

今天写了第一个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];
    }

还有就是,学习这些图论的算法要注意变通、灵活使用。有时候是最长路径,有时候是最短路径,有时候是所有路径中最长的,有时候是所有中最短的,总之,要看准了在用算法。


posted on 2008-07-21 22:18 dosXP 阅读(49) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

公告

研究中...

常用链接

留言簿(1)

随笔档案(2)

文章档案(10)

搜索

最新评论

  • 1. re: 激情
  • 一起加油~~
    哈哈~

    今晚发现了好多人的blog
  • --mgy

阅读排行榜

评论排行榜