題目描述
眾所周知,tt 有乙隻魔法貓。
今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。 tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車票,可以坐一站商業線。假設 tt 換乘的時間忽略不計,請你幫 tt 找到一條去喵星機場最快的線路,不然就要誤機了!
輸入格式
輸入包含多組資料。每組資料第一行為 3 個整數 n, s 和 e (2 ≤ n ≤ 500, 1 ≤ s, e ≤ 100),即貓貓快線中的車站總數,起點和終點(即喵星機場所在站)編號。
下一行包含乙個整數 m (1 ≤ m ≤ 1000),即經濟線的路段條數。
接下來有 m 行,每行 3 個整數 x, y, z (1 ≤ x, y ≤ n, 1 ≤ z ≤ 100),表示 tt 可以乘坐經濟線在車站 x 和車站 y 之間往返,其中單程需要 z 分鐘。
下一行為商業線的路段條數 k (1 ≤ k ≤ 1000)。
接下來 k 行是商業線路段的描述,格式同經濟線。
所有路段都是雙向的,但有可能必須使用商業車票才能到達機場。保證最優解唯一。
輸出格式
對於每組資料,輸出3行。第一行按訪問順序給出 tt 經過的各個車站(包括起點和終點),第二行是 tt 換乘商業線的車站編號(如果沒有使用商業線車票,輸出"ticket not used",不含引號),第三行是 tt 前往喵星機場花費的總時間。
注意:本題不忽略多餘的空格和製表符,且每一組答案間要輸出乙個換行
輸入樣例
414
4122
1332
4434
5124
3
輸出樣例
124
25
題目分析
首先其實這個殘念的輸出格式導致的最大的問題其實不是wa而是pe,畢竟最短路就是個套模板的過程。
但是這道題並不是赤裸裸的最短路問題,它在此基礎上增加了乙個商業線,哦鬼鬼。
不過還好這個商業線只需要選擇一條。
乙個可行的思路是:
這樣下來最短的那條路就是我們記下來的所有的方式裡耗時最短的那個了。
當然了這道題還要求記錄路徑,跑最短路時直接記下每個節點的父節點即可,就是輸出的時候要注意遍歷輸出時先進先出還是先進後出之類的問題。
#include
#include
#include
#include
#include
#include
const
int inf =
0x3f3f3f3f
;using
namespace std;
struct edge};
vectoreconomy[
501]
;vectorbusiness;
int dis1[
501]
;int dis2[
501]
;int vis[
501]
;int path1[
501]
;//記錄路徑
int path2[
501]
;void
spfa
(int source,
int* dis,
int* path)
queue<
int>q;
q.push
(source)
; dis[source]=0
; vis[source]=1
;while
(!q.
empty()
)}}}
}void
print
(bool isbusiness,
int su,
int sv,
int start,
int end,
int time)
cout << start;
while
(!s.
empty()
) cout <<
" "<< sv;
p = sv;
while
(p != end)
cout << endl << su << endl;
cout << time << endl;
}else
cout << start;
while
(!s.
empty()
) cout << endl <<
"ticket not used"
<< endl;
cout << time << endl;}}
intmain()
else
cin >> s >> e;
for(
int i =
0; i <
501; i++
) economy[i]
.clear()
; business.
clear()
; cin >> m;
//經濟線的數目
for(
int i =
0, x, y, z; i < m; i++
) cin >> k;
//商業線的數目
for(
int i =
0, x, y, z; i < k; i++
)memset
(vis,0,
sizeof vis)
;memset
(dis1, inf,
sizeof dis1)
;spfa
(s, dis1, path1)
;memset
(vis,0,
sizeof vis)
;memset
(dis2, inf,
sizeof dis2)
;spfa
(e, dis2, path2)
;int ans1 = inf;
//走商業線的距離
int stationu =0;
//走商業時的中轉站
int stationv =0;
for(
int i =
0; i < business.
size()
; i++
)else
if(ans1 > temp)
}int time =0;
if(ans1 > dis1[e]
)else
print
(isbusiness, stationu, stationv, s, e, time);}
}
Week7 TT 的魔法貓 弗洛伊德演算法
題目描述 眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及...
TT 的旅行日記(Dijkstra
眾所周知,tt 有乙隻魔法貓。今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車...
Week7 B TT 的旅行日記
眾所周知,tt 有乙隻魔法貓。今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車...