hdu2433 Travel

来源:互联网 发布:淘宝限制购买数量 编辑:程序博客网 时间:2024/05/22 00:49

    这道题是一道很巧妙的最短路。题目大致的意思就是给定一张无向图,枚举每条边删去,求剩下的图中每个点对距离之和。

    很明确的是不可能每次去求解整幅图的最短路,这样肯定会超时的,但是很明确的肯定是去预处理,由于最短路这种松弛是不具有可逆性的,就是说在一副松弛的过的网络可以加上一条边去松弛,但是就不可能去删去一条边。这点就让预处理很麻烦。

    刚开始自己的想法是通过类似floyd类似的做法,把所有最近点对用一个矩阵来表示,并没有想到转化成n个顶点的最短路径树,然后把3000条边分为30组,每组100条,求出在所有边删去每组边的最短路矩阵,然后如果去枚举删某条边的话,只需要把对应那组的剩余边更新到最短路矩阵中去,然后呢 嘿嘿,如果用普通的floyd去更新,复杂度依旧是N^3,所有可以把spfa的思想用于求解floyd,用队列记录更新点对,对于每个点对去枚举更新,在想法上应该没有问题,但是还是超时了,也算是一种预处理吧。

    这道题目标程的关键在于两点,第一点在于把所有的最近点对拆分成n个顶点到剩余点的n棵最短路径树,这样子把整体的不容易去表示的拆分成n个点去跑最短路,使得简化, 这样这道题目就已经简化成了通过某一个顶点枚举删去一条边,求剩下的最短路之和,第二点就是在不必每删去一条求一次最短路,求出求出最短路径树之后有n-1条边存在于树上,删去其他的边没有影响。这个问题就拆分成了预处理n棵最短路径树,总共存在n*n-1边 然后跑这么多次最短路,复杂度降为了 n*n*m.

    总结一下,将一个整体分拆成一些部分,对每个部分先进行预处理。这样通过枚举最短路径树上的边,这样子就大大减少了重复计算的次数。对最短路的理解还不够透彻。