(dijkstra记录路径)find the longest of the shortest
Marica對Mirko很生氣,因為他找到了一個新的女朋友,她想報仇。由于她不住在同一個城市,她開始為長途旅行做準備。我們知道每條路從一個城市到另一個城市需要多少分鐘。
米爾科在車里無意中聽到其中一條路正在維修,路被堵住了,但不知道具體是哪條路。無論哪條路是封閉的,從馬里卡的城市到米爾科的都是可能的。
瑪麗卡只走不堵塞的路,而且走最短的路。米爾科想知道她在最壞的情況下要多久才能到達他的城市,這樣他就能確保他的女朋友離開這個城市足夠長時間。編寫一個程序,幫助Mirko找出Marica從沒有堵塞的道路到他所在城市的最短路線所需要的幾分鐘內最長的時間。
輸入
每一種情況都有兩個數字在第一行,N和M,由一個單獨的空間,城鎮的數量,和城鎮之間的道路的數量分開。1≤N≤1000,1≤≤N *(N - 1)/ 2。這些城市的編號從1到N, Mirko位于城市1,Marica位于城市N。
接下來的M行是三個數字A、B和V,用逗號隔開。1≤B≤N 1 V≤≤1000。這些數字意味著a和B城市之間有一條雙向道路,而且在V分鐘內是可以交叉的。
輸出
在輸出文件的第一行中以分鐘為單位寫入最大時間,Marica可能需要花幾分鐘才能到達Mirko。
樣例輸入
5 6
1 2 4
1 3 3
1 2 3
2 4 4
2 5 7
4 5 1
6 7
1 2 1
2 3 4
3 4 4
4 6 4
1 5 5
2 5 2
5 6 5
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
樣例輸出
11
13
27
題意:
最短指時間最短,壞一條邊,此時的最短路的時間比其他壞一條邊之后的最短路的時間長,輸出這個時間
分析與解答
如果拆掉的邊不在最初的最短路上,那么最短路的長度是不會變化的。
那么就只拆最短路上的邊。
(上句話參考:http://blog.sina.com.cn/s/blog_8d84b9240101f827.html)
這樣我們拆的范圍就減小了,怎么算得上拆,就是讓兩個路的距離變成inf即可。由于拆的是最短路上的邊,所以我們還要記錄最短路的路徑。拆完之后我們再調用dijkstra,此時我們不用再記錄最短路的路徑,而且調用完我們還得恢復拆的路,以便下一次拆其他不同的路。
我們看看怎么記錄路徑:
for(j=1;j<=m;j++) if(!vis[j]&&dis[k]+map[k][j]<dis[j]){dis[j]=dis[k]+map[k][j];p[j]=k;//p數組記錄路徑 ,即j點前驅}我們找到了起點到終點k的最短路dis[k],現在以k為起點更新以其他點為終點的最短路dis[j],雖然有可能dis[j]再接下來的循環中會更短,但是沒事,我們的路徑的記錄同樣也會變的,所以我就可以在每次循環中就認定最短路中j的前驅就是k
代碼參考:
https://blog.csdn.net/z8110/article/details/50061289
總結
以上是生活随笔為你收集整理的(dijkstra记录路径)find the longest of the shortest的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的整型_java 整型
- 下一篇: 网上读书关于软件测试,【读书笔记】之软件