日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(dijkstra记录路径)find the longest of the shortest

發布時間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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

#include<stdio.h> #include<string.h> #include<algorithm> #define N 0x3f3f3f3f using namespace std; int map[1100][1100],dis[1100],vis[1100],i,j,k,l,m,n,x,y,z,p[1100]; void dj(int v)//迪杰斯特拉算法 {int i,j,k;memset(vis,0,sizeof(vis));memset(dis,N,sizeof(dis));dis[1]=0;//標記開始點已經被使用 for(i=1;i<=m;i++){int Min=N;for(j=1;j<=m;j++){if(!vis[j]&&dis[j]<Min){Min=dis[j];k=j;}}if(Min==N)//優化,如果沒有找到較小的,直接結束 return ;vis[k]=1;for(j=1;j<=m;j++)if(!vis[j]&&dis[k]+map[k][j]<dis[j]){dis[j]=dis[k]+map[k][j];if(v)p[j]=k;//p數組記錄路徑 ,即j點前驅} } } int main() {while(scanf("%d%d",&m,&n)!=EOF){memset(p,0,sizeof(p));memset(map,N,sizeof(map)); // for(i=1;i<=m;i++) // map[i][i]=0;for(i=0;i<n;i++){scanf("%d%d%d",&x,&y,&z);if(map[x][y]>z)map[x][y]=map[y][x]=z;}//int ans=dj(1);//printf("++%d\n",ans);dj(1);//以1為起點 int Max=dis[m];for(i=m;i!=1;i=p[i])//從m開始是因為p[j]=k是k連的j,一直到m {z=map[i][p[i]];//把當前點和路徑上的當前點的下一個點斷開 map[i][p[i]]=map[p[i]][i]=N;dj(0);// 刪邊之后路徑會改變,只記錄未刪時候的路徑Max=max(Max,dis[m]); map[i][p[i]]=map[p[i]][i]=z;//再連上 }printf("%d\n",Max);} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的(dijkstra记录路径)find the longest of the shortest的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。