[PAT]クラス1030旅行プラン(30点)(SPFA、DFS)

質問の意味:

入力N、M、S、D(N、M <= 500,0 <S、D <N)、次のM個の入力ライン片側の開始点、終了、及び時間によってかけて。最小コスト、最短経路を求めて、入力開始点と終了点を含むこの経路、および出費によって時間によって。

トリック:

バグを見つけるために半時間が最終的に1〜Nの範囲内でDIS配列を初期値に発見され、この質問は、ポイント0〜N-1、変更を初期化するために、第0、ビット境界でのデータのように最初のセットのみからですAC。

コード:

#define HAVE_STRUCT_TIMESPEC
する#include <ビット/ STDC ++ H>
使用して名前空間std。
INTのN、M、S、D。
INT [507]。
typedefは構造体道路{
int型のX、Y、Z。
}。
ベクター<道> EDG [507]。
ベクター<ペア<整数、整数>>事前[507]。
ベクター<ペア<整数、整数>> tmp_path、パス。
INT DIS [507]。
BOOL VIS [507]。
int型ANS = 1E9;
ボイドspfa(){
(I = 0 int型、iがN <; ++ i)が用
DIS [I] = 1E9。
DIS [S] = 0;
VIS [S] = 1。
キュー<整数> Q;
q.push(S);
一方、{(q.empty()!)
INT X = q.front()。
VIS [X] = 0。
q.pop();
以下のために(INT i = 0; I <EDG [X] .size(); ++ I){
int型V = EDG [X] [I] .X。
INT W = EDG [X] [I] .Y。
INTヴァル= EDG [X] [I] .Z。
IF(DIS [V]> DIS [X] + W){
DIS [V] = DIS [X] + W。
事前[V] .clear();
事前[V] .push_back({X、[ヴァル]})。
(!VIS [V]){もし
VIS [V] = 1。
q.push(V);
}
}
そうであれば(DIS [V] == DISが[X] + w)を
予め[V] .push_back({X、[ヴァル]})。
}
}
}
ボイドDFS(int型のx、int型のY){
(x == S)なら、{
もし(Y <ANS){
ANS = Y。
パス= tmp_path。
}
}
tmp_path.push_back({X、Y})。
(I 0 = int型; I <PRE [X] .size(); ++ i)について
のDFS(PRE [X] [i]が1次回、Y +プレ[X] [I] .second)。
tmp_path.pop_back();
}
int型のmain(){
CIN >> N >> M >> S >> D。
int型U、V、W;
(I 1 = int型; I <= M; ++ i)について{
CIN >> U >> V >> W >> [I]。
EDG [U] .push_back({V、W、I})。
EDG [V] .push_back({U、W、I})。
}
spfa()。
DFS(D、0);
coutの<< S <<」「;
(INT I = path.size() - 1; I> = 0; - i)に対する
COUT <<パス[i]が1次回<<」「。
COUT << DIS [D] <<」「<< ANS。
0を返します。
}

おすすめ

転載: www.cnblogs.com/ldudxy/p/11505317.html