TT 的旅行日記(Dijkstra

2021-10-04 21:36:32 字數 3214 閱讀 6725

眾所周知,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:

關鍵操作:鬆弛

設定 s 為源點,???[a]表示源點 s 到點 a 的最短距離, 初始化???[s]=0,???[i]=???(無窮大), 將 s 加入最小堆,每次從堆中取出乙個點 x,遍歷 x 的所有鄰接邊 (?,?,?),比較???[y] 與???[x]+?的大小,若???[y]>???[x]+?,則鬆弛成功。更新???[y]的大小,將 y 加入最小堆中。不斷執行上述操作,直至最小堆為空,最後得到的??s陣列 即為所求單源最短路值 。

具體分析:

大方向上有兩種情況:使用商業線,不使用商業線

其中,使用商業線又有兩種情況:以起點為源點,以終點為源點

依次列舉每條商業線(u, v, w),以起點為源點求單源最短路,得到 dis1 陣列,再以終點為源點求單源最短路,得到 dis2 陣列 取 min,最終再與不走商業線的答案dis[e]取min

獲得路徑:這裡記錄了每個節點的前乙個節點,找到最小路徑之後可以通過記錄的前乙個節點依次確定線路。

這裡使用鏈式前向星儲存邊,注意這是個無向圖,在插邊時要注意一下。

注意點:

本題格式上要求比較嚴格

1.dijkstra的模板

2.容易略掉情況:起點為源點,終點為源點

3.重複使用的陣列及時更新

#include

using

namespace std;

const

int inf=5*

1e8;

struct edgeg[

2000];

int head[

2000

],tot;

//tot是head的下標

void

init()

void

add(

int u,

int v,

int w)

int dis1[

501]

,dis2[

501]

,pre1[

501]

,pre2[

501]

;//pre記錄經過節點的前乙個節點

bool vis[

501]

;int n,s,e,m,x,y,z,k;

struct q};

void

dijkstra1

(int s)

// memset(vis,0,sizeof(vis));

// memset(pre1,-1,sizeof(pre1));

q.push()

; dis1[s]=0

;pre1[s]=-

1;while

(!q.

empty()

));}

}}}void

dijkstra2

(int s)

// memset(vis,0,sizeof(vis));

// memset(pre2,-1,sizeof(pre2));

q.push()

; dis2[s]=0

;pre2[s]=-

1;while

(!q.

empty()

));}

}}}void

thepath1

(int m)

thepath1

(pre1[m]);

printf

(" %d"

,m);

}void

thepath2

(int m)

printf

(" %d"

,m);

}int

main()

dijkstra1

(s);

dijkstra2

(e);

int ans=inf;

//未使用商業線

scanf

("%d"

,&k)

;for

(int i=

0;i(ans2(num!=1)

printf

("\n");

num++;if

(dis1[e]

>ans)

else

}return0;

}

第七周作業 TT 的旅行日記

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

Week7 TT的旅行日記 最短路演算法

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

B dijkstra TT的旅行日記

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