躁动的小Z 最短路+路径记录
生活随笔
收集整理的這篇文章主要介紹了
躁动的小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 最短路+路径记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系兄弟就来砍我 有向图单源最短路
- 下一篇: 纸牌 最小生成树