1. 程式人生 > >HDU 3631 Shortest Path 最短路

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,就掛著吧。。。