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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

躁动的小Z 最短路+路径记录

發布時間:2024/10/6 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 躁动的小Z 最短路+路径记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

躁動的小Z

時間限制:?1 Sec??內存限制:?128 MB

題目描述

你猜怎么樣?小Z追到Gakki了!Gakki邀請小Z去她家共進晚餐,小Z喜出望外。小Z的家和Gakki的家隔著幾個街區,所以他決定乘坐公交車前往

Gakki家赴約。小Z的家在公交站臺的起始站(編號為1),而Gakki家正好在末站(編號為n)。城市中有許多公交站臺,有些站臺之間可以通過公交

線路互相到達。現在給你n個公交站臺和m條不同的公交線路的時間花費,請你幫助小Z分析一下最短的可以從家里來到Gakki身邊的路徑?

輸入

有多組測試樣例。


第一行兩個正整數n,m(2≤n≤10^5,0≤m≤10^5),代表站臺數與公交線路數量。


接下來m行每行三個正整數a[i],b[i],w[i],代表從公交站a[i]到b[i]需要花費的時間為w[i]。(1≤a[i],b[i]≤n,1≤w[i]≤10^6)


注意:公交線路可能會產生環,并且兩個站臺之間可能有多條公交線路。

輸出

單獨一行,輸出花費時間最小時小Z經過的公交站臺編號,以空格隔開;如果小Z無法到達Gakki的家,則輸出-1.

樣例輸入

5 6 1 2 2 2 5 5 2 3 4 1 4 1 4 3 3 3 5 1 10 10 1 5 12 2 4 140 2 10 149 3 6 154 3 7 9 3 8 226 3 10 132 4 10 55 5 8 33 7 8 173

樣例輸出

1 4 3 5 1 5 8 7 3 10

題解

在dijkstra算法模板的基礎上加上一個pre數組,用于記錄該節點的上一個節點,即該點是經過哪一點才到達該點的。pre數組具體在邊松弛的過程中進行重新賦值,松弛成功就將pre值記錄k點,及該點是由起點經過k點后所得到的。最后把pre數組中的值遞歸輸出一遍即可。

#include<bits/stdc++.h> using namespace std; const int maxn = 1e3+9; #define inf 0x3f3f3f3f //需將road及dis初始化為正無窮inf int n,m;int pre[maxn];//記錄到達該點的上一個點的坐標 int dis[maxn]; //儲存各個點到源點的最短距離,dis[s]為0 int road[maxn][maxn]; //兩點之間直接距離關系 bool vis[maxn]; //判斷源點到該點的距離是否為最短距離void dijkstra(int s,int e) {//s為起點,e為終點memset(vis, false, sizeof(vis));//標記是否求出最短路徑vis[s] = true;//標記起點到這一點的最小距離已經求出for(int i = 1; i <= n; i++){dis[i] = road[s][i];//初始化起點到每一個點的距離pre[i]=s;//初始化路徑,每個點的上一個點為起點}for(int u = 1; u < n; u++){int minD = inf,k = -1;for(int i = 1; i<= n; i++){ //尋找沒有訪問過的最短路if(!vis[i]&&dis[i]<minD){k = i;//記錄下標minD = dis[i];//記錄最小值}}if(k==e) break;vis[k] = true;//標記已經訪問過//松弛操作for(int i = 1; i<= n; i++){if(!vis[i]&&dis[k]+road[k][i]<dis[i]){dis[i]=dis[k]+road[k][i];pre[i]=k;}//if}//for} } void print(int cur) {if(cur==1){printf("1");return;}print(pre[cur]);printf(" %d",cur); } int main() {while(scanf("%d%d",&n,&m)!=EOF){memset(road,inf,sizeof(road));memset(pre,0,sizeof(pre));for(int i=1;i<=m;i++){int a,b,d;scanf("%d%d%d",&a,&b,&d);road[a][b]=road[b][a]=min(d,road[a][b]);//起點是fans[i],終點是S}dis[1]=0;//起點dijkstra(1,n);if(dis[n]==inf) printf("-1");else {//printf("dis=%d\n%d:%d\n",dis[i],i,pre[i]);print(n);}printf("\n");}return 0; }

?

總結

以上是生活随笔為你收集整理的躁动的小Z 最短路+路径记录的全部內容,希望文章能夠幫你解決所遇到的問題。

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