HDU 3631 Shortest Path 最短路

         从这个题我想说一下分析题目数据的技巧和重要性。题目大意是:给定一个有向图,点数  N <= 300, 边数 M <= 10^6,然后有Q次询问(Q <= 10^6 ); 每次询问有两种操作:1) 标记一个点 v,如果这个点已经被标记过,输出“ERROR” ; 2) 求两个点u和v的最短路,要求最短路上的点必须全部被标记过;

         网络赛我就悲剧了,没有好好分析数据,竟然真的对于每次询问求了一遍最短路,到最后也是TLE,真是傻X到家了,唉。。。

         我们可以看到,点数很少,只有300,而题目中的询问次数高达10^6,这个对比应该使我们想到,我们需要一个算法能够以O(1)知道任意两个点的最短路,很明显,这10^6的询问里真正有用的标记次数只有300,剩下的除了标记已经标记的点全部是求最短路,除了O(1)任何一个复杂度我们都承受不了。所以算法就出来了,只有floyd能够满足。想到floyd就豁然开朗了,每次标记一个点用O(n^2)进行更新,最多更新n次,所以复杂度是O(n^3),加上询问,复杂度依然够,这个题于是就解决了。

          学到了一点,看到一个题一定要仔细分析,不要上来就做。就像这个,本来floyd复杂度是最短路里最高的,但他的好处是任意两个点查询O(1),所以如果仔细分析就会想到。其他的,管你是堆优化的dijkstra,还是SPFA,就挂着吧。。。

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值