Week7 作業B TT 的旅行日記

2021-10-23 02:20:28 字數 2966 閱讀 3345

眾所周知,tt 有乙隻魔法貓。

今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。 tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車票,可以坐一站商業線。假設 tt 換乘的時間忽略不計,請你幫 tt 找到一條去喵星機場最快的線路,不然就要誤機了!

input

輸入包含多組資料。每組資料第一行為 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 行是商業線路段的描述,格式同經濟線。

所有路段都是雙向的,但有可能必須使用商業車票才能到達機場。保證最優解唯一。

output

對於每組資料,輸出3行。第一行按訪問順序給出 tt 經過的各個車站(包括起點和終點),第二行是 tt 換乘商業線的車站編號(如果沒有使用商業線車票,輸出"ticket not used",不含引號),第三行是 tt 前往喵星機場花費的總時間。

本題不忽略多餘的空格和製表符,且每一組答案間要輸出乙個換行

sample input

4 1 4

41 2 2

1 3 3

2 4 4

3 4 5

12 4 3

sample output

1 2 425

該題為圖中沒有負邊的單源最短路問題,用dijkstra演算法,需要乙個最小堆,兩種方法向優先佇列放負數,或定義遞增優先佇列,變形應用,以起點為源點求單源最短路,得到dis1陣列,再以終點為源點求單源最短路,得到dis陣列,列舉商業線(u,v,w),取min,最終再與不走商業線取min

關於路徑問題,用一陣列pre記錄該點的前乙個結點回溯找路徑,該地方借助vector的函式,push_back(int x),insert(int index,intx)倒序輸出得到路徑

關於換乘商業線的車站編號,要得到min,利用min1,min2記錄兩個換乘點,如果前者大則u為換乘點,否則swap(u,v)

關於tl將cin,cout換為scanf,printf

關於pe,仔細讀題題目要求:本題不忽略多餘的空格和製表符,且每一組答案間要輸出乙個換行,所以多加乙個引數count記錄答案組數,不為0則輸出乙個換行

dijkstra演算法主要用於解決圖中沒有負邊的單源最短路問題,複雜度o((n+m)logn)

貪心策略:從一條路徑還沒有到達的頂點中,選擇乙個可以產生最短路徑的目標頂點,由於圖中只有正邊,所以每個點只會被最小堆彈出一次,即一旦某個點被最小堆彈出,則不會再鬆弛,dis的值為最短路

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int m=

1e5+5;

struct edg};

struct ed};

int dis[m]

;int vis[m]

;int pre[m]

;int dis1[m]

;int pre1[m]

;vectore[m]

;vector<

int>v;

void

dijkstra

(int u)}}

}int

main()

count++

;scanf

("%d"

,&m)

;for

(int i=

0;i)for

(int j=

0;j)dijkstra

(s);

int t=dis[ee]

;for

(int j=

0;j)dijkstra

(ee)

;int mi=m,min1,min2,minp;

scanf

("%d"

,&k)

;for

(int i=

0;i) min1=x;

min2=y;}}

if(mi>t)

v.push_back

(s);

for(

int i=v.

size()

-1;i>=

1;i--

)//cout("%d\nticket not used\n%d\n"

,v[0

],mi);}

else

v.push_back

(s);

int zzd=min2;

while

(zzd!=ee)

v.insert

(v.begin()

,ee)

;for

(int i=v.

size()

-1;i>=

1;i--

)//cout("%d\n%d\n%d\n"

,v[0

],min1,mi);}

v.clear()

;for

(int i=

0;i}return0;

}

week7 作業B TT的旅行日記

眾所周知,tt 有乙隻魔法貓。今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車...

week7作業題 B TT 的旅行日記

眾所周知,tt 有乙隻魔法貓。今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車...

Week7 B TT 的旅行日記

眾所周知,tt 有乙隻魔法貓。今天他在 b 站上開啟了一次旅行直播,記錄他與魔法貓在喵星旅遊時的奇遇。tt 從家裡出發,準備乘坐貓貓快線前往喵星機場。貓貓快線分為經濟線和商業線兩種,它們的速度與價錢都不同。當然啦,商業線要比經濟線貴,tt 平常只能坐經濟線,但是今天 tt 的魔法貓變出了一張商業線車...