最短路專題【完結】

轉自 陳國林http://blog.csdn.net/chenguolinblog/article/details/16870163




第一題 hdu 1317 XYZZY

點擊打開hdu 1317

思路:

1 題目的圖是一個有向圖,並且可能存在環。第一個點的能量值爲100,邊的權值利用能量大小,例如2點爲-60,如果1->2那麼value[1][2] = -60
2 題目明確指出如果是要win的話,那麼必須是經過的每條邊都要大於0.那麼我們只要把那些經過鬆弛操作後的點大於0的入隊即可,小於等於0的點肯定不會出現在最終的路徑上。
3 如果存在正環的話,那麼就有能量值無限大,那麼這個時候只要判斷這個點能否到達n
4 判斷是否是有環還是五環,用一個s標記,s初始化爲0,有環的時候另s = i,然後return。
5 判斷當前點s能否到n直接利用dfs即可。

點擊查看代碼


第二題 uva 567 Risk

點擊打開uva 567

思路:最短路的模板題

點擊查看代碼


第三題 hdu 1874 暢通工程續

點擊打開hdu 1874

思路:最短路模板題

點擊查看代碼


第四題 uva 558 Wormholes

點擊打開uva 558

思路:

1 利用Bellman_Ford來判斷是否存在迴環

2 在利用Bellman_Fordde 時候如果做了n-1次的鬆弛步以後還能更新dis數組,那麼說明原來的圖中存在環,那麼最短路就是不存在的。

點擊查看代碼


第五題uva 10986 Sending email

點擊打開uva 10986

思路:

1 題目給定的n最大20000,m最大50000,分析複雜度後發現只有SPFA最靠譜。
2 分析題目的樣列可知,這一題是要用鄰接矩陣來存儲無向圖,所以要注意無向圖怎麼存儲在鄰階表中
2 連接表的橫列有N項,縱列也是N項。形成的N*N項每項都被稱爲邊結點,每項都有縱橫兩個座標,例如點(N,N-1),表示的就是從第N點向第N-1點有無路徑。由於有E條邊,自然有E條路徑,但是由於無向=雙向,所以要乘以2。

點擊查看代碼


第六題 uva 10801  Lift Hopping

點擊打開uva 10801

思路:

1 有n個電梯,電梯可以到達的層數是一定的,那麼我們就把樓層看成是圖上的點,那麼我們就可以得到的哪些點是有連通的。
2 又由於有多個電梯,所以x->y可能有多種方式,所以這就類似於重邊問題那麼我們要選擇邊權值最小的最爲最後的邊權值。
3 接下來圖建好以後就是考慮怎麼Dijkstra,由於要交換乘坐電梯,那麼我們就自然的想到了圖論中的換邊(鬆弛步),那麼我們就把換乘電梯看成是在換邊,就是說只要做鬆弛步就是在換成電梯,那麼這個時候就要加上等電梯的時間60s。
4 這裏有個地方就是由於源點是會做鬆弛步的,但是源點是不用加上60s的,所以最後輸出的時候要特判一下。如果k爲0,直接輸出0;如果k部位0,那麼最後的輸出要減去60。

點擊查看代碼


第七題 hdu 2544 最短路

點擊打開hdu2544

思路:模板題

點擊查看代碼


第八題 hdu 3790 最短路徑問題

點擊打開hdu 3790

思路:

由於題目要求在最短路徑的時候花費最少,那麼這就是在做鬆弛操作的時候判斷一下當前的選擇的邊的花費是不是最少的,那麼這樣就可以求出最少的花費。利用最短路的思想即可

點擊查看代碼


第九題 hdu 1548 A strange lift

點擊打開hdu 1548

思路:模板題

點擊查看代碼


第十題 hdu 2066 一個人的旅行

點擊打開hdu2066

思路:

題目給定的起點有s個,終點有d個。要求找到從起點到這些終點最短的路徑。很顯然只要枚舉起點然後比較最後得到最小的值。

點擊查看代碼


第十一題 hdu 2112 HDU Today

點擊打開hdu 2112

思路:

1 題目中的起點和終點可能相同,這個時候輸出0。
2 用map映射的時候用char類型,由於string是個類效率比較低。
3 處理成無向圖

點擊查看代碼


第十二題 hdu 1217 Arbitrage

點擊打開hdu 1217

思路:

1 題目要求的是經過一輪的轉換之後,原來的比例能夠大於1。比如原先的“美元:美元 = 1:1”,最後要求能夠達到“美元:美元 > 1”
2 假設dis[i][j]表示“i : j”的比例,那麼初始化dis[i][i] = - 1。
3 由於n最大爲30,所以果斷選擇floyd算法。但是這裏有個地方不同的是,這裏並不是要求最小而是求最大,所以應該要把“小於改成大於”
4 最後只要能夠找到一種貨幣的兌換比例大於1即滿足條件

點擊查看代碼


第十三題 hdu 1245 Saving James Bond

點擊打開hdu 1245

思路:

1 題目講的是有一個湖100x100這個人剛開始在一個直徑爲15的圓心在原點的園內,然後要通過跳躍的方式問我們他是否能夠到達岸邊。如果可以求出最短的路徑和步數
2  很明確就是最短路問題。但是這個時候問題來了,起點和終點是在哪裏,所以我們採用的是將原點作爲起點,岸邊做爲終點。知道了起點和終點,我們就可以求最短路,但是這個時候會碰到另外一個問題,邊的長度。對於這個問題,我們是採取的方法是將這些點分成三類。1類:起點  2類:終點  3類:其它點 ,那麼我們就可以分別對這三類的點求出它和其它點的距離。
注意事項:
1 輸入的數據中,點的範圍可能會在園內或在湖外,所以在輸入的時候要判斷點是否合法。
2 這一題精度要求很嚴格,一些比較之類的要注意精度問題
3 注意n = 0 的情況,這裏如果n = 0,但是d > 42.5 是可以跳出去的。但是隻要有烏龜,這個人就必須通過踩在烏龜上面跳出去,所以n = 0是比較特殊的。
4  n不大所以什麼方法都可以做
5 求所需幾步的時候利用一個setp[][]數組,首先初始戶爲0然後將可以到達的點標記爲1,最後只要在更新dis[][]的時候更新即可。

點擊查看代碼


第十四題 hdu 1535 Invitation Cards

點擊打開鏈接

思路:

1 題目要求的是總的最小的花費,意思就是要求每一個人的花費都最小。
2 由於每一個人都是從1出去,最後還是都要回到1的,那麼求解的時候就要分成兩部分“出去+回來”;出去的話直接利用SPFA(1),1作爲起點即可求出每一點的最小花費,回來的話如果是直接利用對每一個人進行SPFA,那麼這樣肯定超時。仔細想想要求的是每一個點到1的最小距離,那麼由於給定的是一個有向圖,那麼只要重新建圖把邊反向,那麼我們所求的問題就變成1到每一個點的最小距離。所以只要兩步SPFA(1)即可。
3 數據類型爲long long

點擊查看代碼


第十五題 hdu 1546 Idiomatic Phrases Game

點擊打開hdu 1546

思路:

1  只要建好圖,然後利用SPFA求解最短路即可。注意字符串的處理
2  定義一個char ch[10]數組,如果給數組的每一個元素值賦值後,還要記得要在最後ch[9]添加‘\0’,表示結束。就是如果要保存10個元素,那麼數組最小要開到11,因爲第11個表示‘\0’來表示正常結束。所以數組儘量開大點

點擊查看代碼


第十六題 hdu 2680 Choose the best route

點擊打開hdu 2680

思路:

1 題目要求的是從某一個站點能否到達目標站點
2 題目的其實站點有多個,如果都對每一個站點進行SPFA的話那麼肯定TLE的。所以這個時候我們想到了增加一個新的點0,用來作爲新的起點。這個時候只要把能夠和0相連的點的權值標記爲0即可。
3 注意這一題的圖是一個有向圖

點擊查看代碼


第十七題 hdu 2923 Einbahnstrasse

點擊打開hdu 2923

思路:

1 題目要求的是有n個點,然後有c個破車,這個c個破車可能在同一城市裏面,現在要把這些破車統一拉到中心點1.
2 這題的中心在1點,那麼所求 ans = 1->所有破車的距離之和 + 所有破車->1的之和。所以這裏涉及到1->所有破車的距離 和 所有破車->1的距離,那麼我們可以使用SPFA和floyd。如果使用的是floyd那麼最後的ans = dis[1][i]+dis[i][1];如果是SPFA就要先求一下1->所有破車的距離之和,然後在重新建圖就是把邊反向然後對1點SPFA ,在加上1->所有破車的和即可。
4  點的表示,利用map映射。
3  這一題給的n雖然才100,但是利用SPFA的時候要數組記得開1010,因爲c最大爲1000.這個地方杭電是WA,不給RE,所以我WA了40+。

點擊查看代碼


第十八題 hdu 3339 In Action

點擊打開hdu 3339

思路:

1 這一題多了一個限制條件能量,即每一點都有一個自己的能量值。
2 問題是要求能量至少要大於1/2的情況下的最短路,最開始我理解成是貪心,然後就是無休止的的WA,後來才知道是dp。其實很好理解,對於每一個點的能量只有兩種選擇取或者不取,那麼這就是典型的0/1揹包問題。但是有一個問題就是選取什麼作爲揹包的容量,剛開始我選擇pow_sum作爲揹包的容量,然後距離爲價值求dp,然後又是一頓WA。後來改成了以cost_sum作爲揹包的容量,然後pow作爲價值求解dp,最後判斷是否有一個
dp[i] > sum/2然後就1 A了。
3 注意題目明確指出有多個坦克,意思就是每一個坦克都從0開出並且只能攻擊一個點。

點擊查看代碼


第十九題 hdu 2807 The Shortest Path

點擊打開hdu 2807

思路:

1 題目明確要求x->y是否有了,而且有多次詢問,所以序則floyd
2 題目給的點的形式是矩陣,所以還要去處理矩陣,判斷A*B=C
3 題目說了A B C三個城市,所以做A B C三個是不同的

點擊查看代碼


第二十題 hdu 1595 find the longest of the shortest

點擊打開hdu 1595

思路:

1 題目要求的是刪掉一條邊之和求出的最短路中的最大值。
2 很明顯,肯定是要先求出原圖的最短路並且記錄父親節點。現在我們可以想,如果要枚舉所有的邊,顯然這個是不可能的實現的。所以我們仔細分析可以知道其實能夠對最短路產生影響的就是原圖最短路上的邊,所以我們只需要去枚舉刪除最短路徑上面邊然後求最短路即可,最後得到ans
3 這一題的n <= 1000 , m<=n*(n-1)/2 , 剛開始我用的SPFA,然後就開始TLE。後來知道了,有些時候SPFA的期望值中O(ke),有些題目會卡k,所以這個時候只能選擇優先隊列的Dij算法了。
4 題目用到了捆綁兩種類型的pair<int , int>pii;

點擊查看代碼


第二十一題 hdu 1599 find the mincost route

點擊打開hdu 1599

思路:

1 題目要求的是能否有從某一個點出發至少經過兩個不同點然後回到源點,有的話求最小路徑長度。
2 題意很明確就是要求最小環問題 , 所以現在用到了floyd的一個擴展求解圖上最小環。
3 <<floyd求解環中的最小環>>
   1 爲什麼要在更新最短路之前求最小環:
      在第k層循環,我們要找的是最大結點爲k的環,而此時Dist數組存放的是k-1層循環結束時的經過k-1結點的最短路徑,也就是說以上求出的最短路是不經過k點的,這就剛好符合我們的要求。爲什麼呢?假設環中結點i,j是與k直接相連,如果先求出經過k的最短路,那麼會有這樣一種情況,即:i到j的最短路經過k。這樣的話就形成不了環 。

   2最小環改進算法的證明:
      一個環中的最大結點爲k(編號最大),與他相連的兩個點爲i,j,這個環的最短長度爲g[i][k]+g[k][j]+dis[i][j] (i到j的路徑中,所有結點編號都小於k的最短路徑長度)。根據floyd的原理,在最外層循環做了k-1次之後,dist[i][j]則代表了i到j的路徑中,所有結點編號都小於k的最短路徑, 綜上所述,該算法一定能找到圖中最小環。

   3 爲什麼還要value數組:
      因爲dis數組時刻都在變動不能表示出原來兩個點之間的距離。

   4 形成環至少要有3點不同的點,兩個點是不能算環的,所以有i , j , k不同。

4 注意:hdu有時候比較特別,你使用long long的話oj給的是WA,這一題我用long long WA了,所以用int。

點擊查看代碼


第二十二題 hdu 3986 Harry Potter and the Final Battle

點擊打開hdu 3986

思路:

1 題目要求的是刪除一條之和的最壞情況,並不是刪除一條邊之後的最短路(WA了好久不解釋)。如果都可以到n,那麼輸入刪除一條之後的最短路徑。
2 利用鄰階表+優先隊列優化+Dij可以做
3 father數組記錄的是在原圖中的1->n的最短路徑中當前這個點的前一條邊的編號。
4 在鄰階表裏刪除一條邊相當於就是邊的權值變爲INF

點擊查看代碼


第二十三題 hdu 1839 Delay Constrained Maximum Capacity Path

點擊打開hdu 1839

思路:

1 題目要求的是在限制時間t之內,最大的容量。而題目說了最大的容量就是路徑上的最小的邊值。
2 這裏加了一個容量,而且是要求一條邊的最短。所以這裏用到了二分,因爲我們知道隨着邊長的增大能夠滿足的路徑越來越少,所以我們只要去枚舉容量即可。

點擊查看代碼


第二十四題 hdu 3631 Shortest Path

點擊打開hdu 3631

思路:

1 題目給的n <= 300,而邊數m<=100000,並且有Q<= 100000次詢問。剛開始我用優先隊列+Dij然後就開始TLE,然後就沒然後了。
2 看了題解之後猛然發現這尼瑪就是floyd,(對算法理解不透測)。我們知道floyd就是每次都拿一箇中間點k來更新dis,題目中是隻有標記過的點才能夠使用,那麼就像floyd一樣只要是標記來這個點那麼就可以用這個點來進行更新dis,然後如果要求兩點直間的距離只要查找即可。

點擊查看代碼


第二十五題 hdu 1869 六度分離

點擊打開hdu 1869

思路:

1 題目是要求所有的數據能否滿足“六度分離”,那麼我們就想到所有點之間的最短距離。
2 應用floyd,如果兩點之間有聯繫那麼距離標記爲1,那麼最後只要判斷是不是每兩個人之間的距離是不是都不大於7(這裏爲什麼是7不是6自己畫圖).

點擊查看代碼


第二十六題 hdu 1224 Free DIY Tour

點擊打開hdu 11224

思路:

1 提要要求的最大的環,蛋並不是這麼的複雜,因爲第一個點的points值爲0,所以其實就是求1到某一個點的最長路,其實就是最長路問題
2 注意的是在求1到某一個點的最長路的時候還要注意這個點是否能夠到達1點,這個可以用一個mark數組來標記
3 可以更簡單的做法就是1-n+1的最長路。

點擊查看代碼


第二十七題 hdu 1385 Minimum Transport Cost

點擊打開hdu 1385

思路:

1 題目要求的單源的最短路,所以可以選擇任意一種單源最短路來求解
2 題目還要求在路徑和相同情況下要字典序小的,那麼就要在更新dis數組的時候進行更新路徑,如果是dis[i]>tmp,那麼直接更新;如果是dis[i] == tmp的情況下,那麼就要求出star->i 和 star->x的路徑進行比較,然後判斷能否更新.

3 注意詢問的時候可能問的是同一個點。

點擊查看代碼

第一題 hdu 1317 XYZZY

點擊打開hdu 1317

思路:

1 題目的圖是一個有向圖,並且可能存在環。第一個點的能量值爲100,邊的權值利用能量大小,例如2點爲-60,如果1->2那麼value[1][2] = -60
2 題目明確指出如果是要win的話,那麼必須是經過的每條邊都要大於0.那麼我們只要把那些經過鬆弛操作後的點大於0的入隊即可,小於等於0的點肯定不會出現在最終的路徑上。
3 如果存在正環的話,那麼就有能量值無限大,那麼這個時候只要判斷這個點能否到達n
4 判斷是否是有環還是五環,用一個s標記,s初始化爲0,有環的時候另s = i,然後return。
5 判斷當前點s能否到n直接利用dfs即可。

點擊查看代碼


第二題 uva 567 Risk

點擊打開uva 567

思路:最短路的模板題

點擊查看代碼


第三題 hdu 1874 暢通工程續

點擊打開hdu 1874

思路:最短路模板題

點擊查看代碼


第四題 uva 558 Wormholes

點擊打開uva 558

思路:

1 利用Bellman_Ford來判斷是否存在迴環

2 在利用Bellman_Fordde 時候如果做了n-1次的鬆弛步以後還能更新dis數組,那麼說明原來的圖中存在環,那麼最短路就是不存在的。

點擊查看代碼


第五題uva 10986 Sending email

點擊打開uva 10986

思路:

1 題目給定的n最大20000,m最大50000,分析複雜度後發現只有SPFA最靠譜。
2 分析題目的樣列可知,這一題是要用鄰接矩陣來存儲無向圖,所以要注意無向圖怎麼存儲在鄰階表中
2 連接表的橫列有N項,縱列也是N項。形成的N*N項每項都被稱爲邊結點,每項都有縱橫兩個座標,例如點(N,N-1),表示的就是從第N點向第N-1點有無路徑。由於有E條邊,自然有E條路徑,但是由於無向=雙向,所以要乘以2。

點擊查看代碼


第六題 uva 10801  Lift Hopping

點擊打開uva 10801

思路:

1 有n個電梯,電梯可以到達的層數是一定的,那麼我們就把樓層看成是圖上的點,那麼我們就可以得到的哪些點是有連通的。
2 又由於有多個電梯,所以x->y可能有多種方式,所以這就類似於重邊問題那麼我們要選擇邊權值最小的最爲最後的邊權值。
3 接下來圖建好以後就是考慮怎麼Dijkstra,由於要交換乘坐電梯,那麼我們就自然的想到了圖論中的換邊(鬆弛步),那麼我們就把換乘電梯看成是在換邊,就是說只要做鬆弛步就是在換成電梯,那麼這個時候就要加上等電梯的時間60s。
4 這裏有個地方就是由於源點是會做鬆弛步的,但是源點是不用加上60s的,所以最後輸出的時候要特判一下。如果k爲0,直接輸出0;如果k部位0,那麼最後的輸出要減去60。

點擊查看代碼


第七題 hdu 2544 最短路

點擊打開hdu2544

思路:模板題

點擊查看代碼


第八題 hdu 3790 最短路徑問題

點擊打開hdu 3790

思路:

由於題目要求在最短路徑的時候花費最少,那麼這就是在做鬆弛操作的時候判斷一下當前的選擇的邊的花費是不是最少的,那麼這樣就可以求出最少的花費。利用最短路的思想即可

點擊查看代碼


第九題 hdu 1548 A strange lift

點擊打開hdu 1548

思路:模板題

點擊查看代碼


第十題 hdu 2066 一個人的旅行

點擊打開hdu2066

思路:

題目給定的起點有s個,終點有d個。要求找到從起點到這些終點最短的路徑。很顯然只要枚舉起點然後比較最後得到最小的值。

點擊查看代碼


第十一題 hdu 2112 HDU Today

點擊打開hdu 2112

思路:

1 題目中的起點和終點可能相同,這個時候輸出0。
2 用map映射的時候用char類型,由於string是個類效率比較低。
3 處理成無向圖

點擊查看代碼


第十二題 hdu 1217 Arbitrage

點擊打開hdu 1217

思路:

1 題目要求的是經過一輪的轉換之後,原來的比例能夠大於1。比如原先的“美元:美元 = 1:1”,最後要求能夠達到“美元:美元 > 1”
2 假設dis[i][j]表示“i : j”的比例,那麼初始化dis[i][i] = - 1。
3 由於n最大爲30,所以果斷選擇floyd算法。但是這裏有個地方不同的是,這裏並不是要求最小而是求最大,所以應該要把“小於改成大於”
4 最後只要能夠找到一種貨幣的兌換比例大於1即滿足條件

點擊查看代碼


第十三題 hdu 1245 Saving James Bond

點擊打開hdu 1245

思路:

1 題目講的是有一個湖100x100這個人剛開始在一個直徑爲15的圓心在原點的園內,然後要通過跳躍的方式問我們他是否能夠到達岸邊。如果可以求出最短的路徑和步數
2  很明確就是最短路問題。但是這個時候問題來了,起點和終點是在哪裏,所以我們採用的是將原點作爲起點,岸邊做爲終點。知道了起點和終點,我們就可以求最短路,但是這個時候會碰到另外一個問題,邊的長度。對於這個問題,我們是採取的方法是將這些點分成三類。1類:起點  2類:終點  3類:其它點 ,那麼我們就可以分別對這三類的點求出它和其它點的距離。
注意事項:
1 輸入的數據中,點的範圍可能會在園內或在湖外,所以在輸入的時候要判斷點是否合法。
2 這一題精度要求很嚴格,一些比較之類的要注意精度問題
3 注意n = 0 的情況,這裏如果n = 0,但是d > 42.5 是可以跳出去的。但是隻要有烏龜,這個人就必須通過踩在烏龜上面跳出去,所以n = 0是比較特殊的。
4  n不大所以什麼方法都可以做
5 求所需幾步的時候利用一個setp[][]數組,首先初始戶爲0然後將可以到達的點標記爲1,最後只要在更新dis[][]的時候更新即可。

點擊查看代碼


第十四題 hdu 1535 Invitation Cards

點擊打開鏈接

思路:

1 題目要求的是總的最小的花費,意思就是要求每一個人的花費都最小。
2 由於每一個人都是從1出去,最後還是都要回到1的,那麼求解的時候就要分成兩部分“出去+回來”;出去的話直接利用SPFA(1),1作爲起點即可求出每一點的最小花費,回來的話如果是直接利用對每一個人進行SPFA,那麼這樣肯定超時。仔細想想要求的是每一個點到1的最小距離,那麼由於給定的是一個有向圖,那麼只要重新建圖把邊反向,那麼我們所求的問題就變成1到每一個點的最小距離。所以只要兩步SPFA(1)即可。
3 數據類型爲long long

點擊查看代碼


第十五題 hdu 1546 Idiomatic Phrases Game

點擊打開hdu 1546

思路:

1  只要建好圖,然後利用SPFA求解最短路即可。注意字符串的處理
2  定義一個char ch[10]數組,如果給數組的每一個元素值賦值後,還要記得要在最後ch[9]添加‘\0’,表示結束。就是如果要保存10個元素,那麼數組最小要開到11,因爲第11個表示‘\0’來表示正常結束。所以數組儘量開大點

點擊查看代碼


第十六題 hdu 2680 Choose the best route

點擊打開hdu 2680

思路:

1 題目要求的是從某一個站點能否到達目標站點
2 題目的其實站點有多個,如果都對每一個站點進行SPFA的話那麼肯定TLE的。所以這個時候我們想到了增加一個新的點0,用來作爲新的起點。這個時候只要把能夠和0相連的點的權值標記爲0即可。
3 注意這一題的圖是一個有向圖

點擊查看代碼


第十七題 hdu 2923 Einbahnstrasse

點擊打開hdu 2923

思路:

1 題目要求的是有n個點,然後有c個破車,這個c個破車可能在同一城市裏面,現在要把這些破車統一拉到中心點1.
2 這題的中心在1點,那麼所求 ans = 1->所有破車的距離之和 + 所有破車->1的之和。所以這裏涉及到1->所有破車的距離 和 所有破車->1的距離,那麼我們可以使用SPFA和floyd。如果使用的是floyd那麼最後的ans = dis[1][i]+dis[i][1];如果是SPFA就要先求一下1->所有破車的距離之和,然後在重新建圖就是把邊反向然後對1點SPFA ,在加上1->所有破車的和即可。
4  點的表示,利用map映射。
3  這一題給的n雖然才100,但是利用SPFA的時候要數組記得開1010,因爲c最大爲1000.這個地方杭電是WA,不給RE,所以我WA了40+。

點擊查看代碼


第十八題 hdu 3339 In Action

點擊打開hdu 3339

思路:

1 這一題多了一個限制條件能量,即每一點都有一個自己的能量值。
2 問題是要求能量至少要大於1/2的情況下的最短路,最開始我理解成是貪心,然後就是無休止的的WA,後來才知道是dp。其實很好理解,對於每一個點的能量只有兩種選擇取或者不取,那麼這就是典型的0/1揹包問題。但是有一個問題就是選取什麼作爲揹包的容量,剛開始我選擇pow_sum作爲揹包的容量,然後距離爲價值求dp,然後又是一頓WA。後來改成了以cost_sum作爲揹包的容量,然後pow作爲價值求解dp,最後判斷是否有一個
dp[i] > sum/2然後就1 A了。
3 注意題目明確指出有多個坦克,意思就是每一個坦克都從0開出並且只能攻擊一個點。

點擊查看代碼


第十九題 hdu 2807 The Shortest Path

點擊打開hdu 2807

思路:

1 題目明確要求x->y是否有了,而且有多次詢問,所以序則floyd
2 題目給的點的形式是矩陣,所以還要去處理矩陣,判斷A*B=C
3 題目說了A B C三個城市,所以做A B C三個是不同的

點擊查看代碼


第二十題 hdu 1595 find the longest of the shortest

點擊打開hdu 1595

思路:

1 題目要求的是刪掉一條邊之和求出的最短路中的最大值。
2 很明顯,肯定是要先求出原圖的最短路並且記錄父親節點。現在我們可以想,如果要枚舉所有的邊,顯然這個是不可能的實現的。所以我們仔細分析可以知道其實能夠對最短路產生影響的就是原圖最短路上的邊,所以我們只需要去枚舉刪除最短路徑上面邊然後求最短路即可,最後得到ans
3 這一題的n <= 1000 , m<=n*(n-1)/2 , 剛開始我用的SPFA,然後就開始TLE。後來知道了,有些時候SPFA的期望值中O(ke),有些題目會卡k,所以這個時候只能選擇優先隊列的Dij算法了。
4 題目用到了捆綁兩種類型的pair<int , int>pii;

點擊查看代碼


第二十一題 hdu 1599 find the mincost route

點擊打開hdu 1599

思路:

1 題目要求的是能否有從某一個點出發至少經過兩個不同點然後回到源點,有的話求最小路徑長度。
2 題意很明確就是要求最小環問題 , 所以現在用到了floyd的一個擴展求解圖上最小環。
3 <<floyd求解環中的最小環>>
   1 爲什麼要在更新最短路之前求最小環:
      在第k層循環,我們要找的是最大結點爲k的環,而此時Dist數組存放的是k-1層循環結束時的經過k-1結點的最短路徑,也就是說以上求出的最短路是不經過k點的,這就剛好符合我們的要求。爲什麼呢?假設環中結點i,j是與k直接相連,如果先求出經過k的最短路,那麼會有這樣一種情況,即:i到j的最短路經過k。這樣的話就形成不了環 。

   2最小環改進算法的證明:
      一個環中的最大結點爲k(編號最大),與他相連的兩個點爲i,j,這個環的最短長度爲g[i][k]+g[k][j]+dis[i][j] (i到j的路徑中,所有結點編號都小於k的最短路徑長度)。根據floyd的原理,在最外層循環做了k-1次之後,dist[i][j]則代表了i到j的路徑中,所有結點編號都小於k的最短路徑, 綜上所述,該算法一定能找到圖中最小環。

   3 爲什麼還要value數組:
      因爲dis數組時刻都在變動不能表示出原來兩個點之間的距離。

   4 形成環至少要有3點不同的點,兩個點是不能算環的,所以有i , j , k不同。

4 注意:hdu有時候比較特別,你使用long long的話oj給的是WA,這一題我用long long WA了,所以用int。

點擊查看代碼


第二十二題 hdu 3986 Harry Potter and the Final Battle

點擊打開hdu 3986

思路:

1 題目要求的是刪除一條之和的最壞情況,並不是刪除一條邊之後的最短路(WA了好久不解釋)。如果都可以到n,那麼輸入刪除一條之後的最短路徑。
2 利用鄰階表+優先隊列優化+Dij可以做
3 father數組記錄的是在原圖中的1->n的最短路徑中當前這個點的前一條邊的編號。
4 在鄰階表裏刪除一條邊相當於就是邊的權值變爲INF

點擊查看代碼


第二十三題 hdu 1839 Delay Constrained Maximum Capacity Path

點擊打開hdu 1839

思路:

1 題目要求的是在限制時間t之內,最大的容量。而題目說了最大的容量就是路徑上的最小的邊值。
2 這裏加了一個容量,而且是要求一條邊的最短。所以這裏用到了二分,因爲我們知道隨着邊長的增大能夠滿足的路徑越來越少,所以我們只要去枚舉容量即可。

點擊查看代碼


第二十四題 hdu 3631 Shortest Path

點擊打開hdu 3631

思路:

1 題目給的n <= 300,而邊數m<=100000,並且有Q<= 100000次詢問。剛開始我用優先隊列+Dij然後就開始TLE,然後就沒然後了。
2 看了題解之後猛然發現這尼瑪就是floyd,(對算法理解不透測)。我們知道floyd就是每次都拿一箇中間點k來更新dis,題目中是隻有標記過的點才能夠使用,那麼就像floyd一樣只要是標記來這個點那麼就可以用這個點來進行更新dis,然後如果要求兩點直間的距離只要查找即可。

點擊查看代碼


第二十五題 hdu 1869 六度分離

點擊打開hdu 1869

思路:

1 題目是要求所有的數據能否滿足“六度分離”,那麼我們就想到所有點之間的最短距離。
2 應用floyd,如果兩點之間有聯繫那麼距離標記爲1,那麼最後只要判斷是不是每兩個人之間的距離是不是都不大於7(這裏爲什麼是7不是6自己畫圖).

點擊查看代碼


第二十六題 hdu 1224 Free DIY Tour

點擊打開hdu 11224

思路:

1 提要要求的最大的環,蛋並不是這麼的複雜,因爲第一個點的points值爲0,所以其實就是求1到某一個點的最長路,其實就是最長路問題
2 注意的是在求1到某一個點的最長路的時候還要注意這個點是否能夠到達1點,這個可以用一個mark數組來標記
3 可以更簡單的做法就是1-n+1的最長路。

點擊查看代碼


第二十七題 hdu 1385 Minimum Transport Cost

點擊打開hdu 1385

思路:

1 題目要求的單源的最短路,所以可以選擇任意一種單源最短路來求解
2 題目還要求在路徑和相同情況下要字典序小的,那麼就要在更新dis數組的時候進行更新路徑,如果是dis[i]>tmp,那麼直接更新;如果是dis[i] == tmp的情況下,那麼就要求出star->i 和 star->x的路徑進行比較,然後判斷能否更新.

3 注意詢問的時候可能問的是同一個點。

點擊查看代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章