codeup 問題 D 最短路徑

2021-10-19 13:27:56 字數 1391 閱讀 6271

題目描述

有n個城市m條道路(n<1000, m<10000),每條道路有個長度,請找到從起點s到終點t的最短距離和經過的城市名。

輸入輸入包含多組測試資料。

每組第一行輸入四個數,分別為n,m,s,t。

接下來m行,每行三個數,分別為兩個城市名和距離。

輸出每組輸出佔兩行。

第一行輸出起點到終點的最短距離。

第二行輸出最短路徑上經過的城市名,如果有多條最短路徑,輸出字典序最小的那條。若不存在從起點到終點的路徑,則輸出「can't arrive」。

樣例輸入

3 3 1 3

1 3 3

1 2 1

2 3 1

樣例輸出

2

1 2 3

#define _crt_secure_no_warnings

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define maxn 1008

struct node ;

int n, m;

vectoradj[maxn];//鄰接表

int pre[maxn];//記錄到達結點v的最短路徑中,v的前驅u

int d[maxn];//記錄單源最短距離

int num[maxn];//記錄spfa結點入隊次數

bool inq[maxn];//判斷結點是否在spfa演算法的佇列中

const int inf = 0x3fffffff;

//在spfa演算法中,佇列中的結點是:剛剛被優化最短距離的結點,

//而優化了乙個結點u的最短距離,與這個結點相連的其他結點v的最短距離就可能可以被繼續優化

//所以我們遍歷其他結點v,找到可以優化的結點,然後繼續放進佇列inqueue

bool spfa(int s)

}//u < pre[v]是關鍵,因為題目要求找到字典最小的路徑

//所以我們要求路徑長度相同的條件下,每個結點的序號盡可能小

else if (d[u] + dis == d[v] && u < pre[v])

} }return true;

}void dfs(int v)

dfs(pre[v]);

cout << " " << v;

}void init()

}int main()

spfa(start);

if (d[dest] != inf)

else

} return 0;

}

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...

演算法筆記 問題 D 最短路徑

題目描述 有n個城市m條道路 n 1000,m 10000 每條道路有個長度,請找到從起點s到終點t的最短距離和經過的城市名。輸入輸入包含多組測試資料。每組第一行輸入四個數,分別為n,m,s,t。接下來m行,每行三個數,分別為兩個城市名和距離。輸出每組輸出佔兩行。第一行輸出起點到終點的最短距離。第二...