week7作業題 B TT 的旅行日記

2021-10-04 21:42:43 字數 2870 閱讀 8059

眾所周知,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 前往喵星機場花費的總時間。

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

輸入樣例

4 1 4

41 2 2

1 3 3

2 4 4

3 4 5

12 4 3

輸出樣例

1 2 425

這題我們可以知道是求單元點最短路的問題。我們使用的是dijkstra演算法,當然不是純粹的dijkstra,需要做一些變形。在這個題目中我們首先初始化dis[s] = 0,dis[i] = inf(無窮大),將s加入最小堆中,然後每次從堆中取處乙個點,然後對其進行鬆弛操作。在這個圖中所有的邊都是正邊,因此每個點只會被最小堆彈出一次。即一旦某個點被最小堆彈出,則不會鬆弛,dis的值為最短路。在這個題目中,我們可以有兩種思路:

思路1:題目中給定了起點個終點,而且商業線最多乘坐一次;可以列舉每一條商業線,計算起點u的最短路以及v到終點的最短路再加上該商業線所花費的時間。以起點為源點求單源最短路,得到dis1陣列;再以終點為源點求單元最短路,得到dis2陣列。列舉商業線(u,v,w),取min,最終再與不走商業線的答案取min。

思路2:跑一次單源點最短路(變形),記錄答案dis[u][0/1];dis[u][0]表示從起點到結點u沒有經過商業線時的最短路,在鬆弛的時候可以選擇商業線或者經濟線,dis[u][1]表示從起點到結點u經過商業線後的最短路,在鬆弛的時候只能選擇經濟線。

這裡我們選用的是第一種思路,這裡我們首先從起點和終點跑兩邊dijkstra,並且使用兩個path陣列記錄路徑資訊,其中path[i]是結點i的前乙個鄰接點。然後列舉商業線,求出商業線中的最小值,然後和不走商業線的答案取min。最後分走商業線和不走商業線兩種情況輸出路徑。這裡我們使用的輸出路徑的方法是使用乙個雙向佇列deque型別來儲存,即將path陣列中的路徑資訊經過轉換copy到雙向佇列中。最後再輸出。

#include

#include

#include

#include

#include

#define _for(i,a,b) for(int i = (a); i < (b); i++)

#define _rep(i,a,b) for(int i = (a); i <= (b); i++)

using

namespace std;

const

int maxn =

1010

;const

int maxm =

510;

const

int inf =5*

1e7;

int n,s,e,m,k;

int dis1[maxn]

,dis2[maxn]

,head[maxn]

,vis[maxn]

,path1[maxn]

,path2[maxn]

;int flag,ans = inf;

int l,r;

int tot,cnt;

int count =1;

struct edgeed[

4*maxn]

;void

add_edge

(int u,

int v,

int w)

priority_queueint,

int>

> q;

deque<

int> v;

void

dijkstra

(int s,

int dis,

int path)

}}}int

main()

dijkstra

(s,dis1,path1)

;dijkstra

(e,dis2,path2);

cin >> k;

_for

(i,0

,k)if

(dis2[x]

+ dis1[y]

+ z < ans)}if

(count ==

1)count++

;else cout << endl;

if(dis1[e]

< ans)

else

}}

week7 作業B TT的旅行日記

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

Week7 作業B TT 的旅行日記

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

week7作業題 C TT 的美夢

這一晚,tt 做了個美夢!在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 n,其中 1 號城市是 tt 所在的城市,即首都。喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦惱之時,他的魔法小貓咪提出...