B dijkstra TT的旅行日記

2022-06-22 08:33:09 字數 2958 閱讀 3076

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

25本題商業線的引入使得問題變得複雜化,如果沒有商業線,則問題變成了簡單的圖問題中的最短路問題。

我們發現加入商業線以後有兩種做法,最短路中包含一條商業線或者不包含商業線。

對於不包含商業線的情況,我們可以求乙個最短路。

對於包含商業線的情況,因為只走一條商業線,我們可以列舉每一條商業線的情況,然後取最小。

接下來,對於走(一條)商業線的問題怎麼求短路呢?

分別從起點和終點跑一次最短路,然後取兩次的最小值

min (dis1[u]+dis2[v]+w , dis1[v]+dis2[u]+w ) 

最後合併以上 以上情況,取最小即可!

1 #include2 #include

3 #include4

using

namespace

std;

5const

int maxn=1000010;6

int n,m,k,s,e,tot,ans=10000000

,sum;

7int

head[maxn],dis1[maxn],dis2[maxn];

8int

pre1[maxn],pre2[maxn];

9int

p[maxn],a[maxn];

10bool

flag[maxn];

11int

ans_u,ans_v,ans_w;

12struct

node

13e1[maxn];

18void add_edge(int u,int v,int

w)19

2526

void dijkstra(int u,int *dis,int *pre)

2741 flag[k]=1;42

for(int j=head[k];j;j=e1[j].next)

43if(!flag[e1[j].v]&&dis[e1[j].v]>dis[k]+e1[j].w) //

鬆弛 4448}

49}50int

main()

5170

71dijkstra(s,dis1,pre1) ;

72dijkstra(e,dis2,pre2) ;

7374 cin>>k;

75int ans=dis1[e];

76for(int i=1;i<=k;i++)

7785

if(dis2[u]+dis1[v]+w//

再次更新

8691}92

inttmp;

93if(ans_u==0)//

不需要商務線

94102

for(int i=sum;i>=2;i--) cout<"";

103 cout<1]<104 cout<<"

ticket not used

"105}

106else

//需要商務線

107115

for(int i=1;i<=sum/2;i++)

116 swap(a[i],a[sum-i+1

]);117 tmp=ans_u;

118while

(tmp)

119124

for(int i=sum;i>=2;i--) cout<"";

125 cout<1]<126 cout127}

128129

if(cin>>n>>s>>e)

130 cout每個輸出換行

131else

132break

;133

}134

return0;

135 }

東京 日帰 旅行

私 二回目 東京 旅。前回 東京 観光地 中心 旅 今回 日本 友達 勧 旅 前回 目的地 多 慌 旅 今回 予定 少 足 向 旅 前回 日本語 上手 同僚 手伝 団體 旅 今回 十分 日本文化 觸 一人 旅 私 私 気持 全然違 似 二 旅 上野駅 起點 前回 上野公園 上野動物園 淺草 秋葉原 ...

dp P2134 百日旅行

這個題目顯然有乙個n 2的做法 include include include using namespace std int f 200005 ff 200005 int n,m,p,q int main 標準的暴力 我們考慮優化 顯然q p的話直接全q就好了 然後對於ff陣列 直接不列舉了,結合...

P2134 百日旅行

重要的不是去 而是和你在一起。小紅 對小明和小紅來說,2014年7月29日是乙個美好的日子。這一天是他們相識100天的紀念日。小明 小紅,感謝你2場大考時默默的支援,100個日夜的陪伴 感謝你照亮我100個美好的日子,給我留下無數美好的回憶 在這個美好的日子裡,我準備帶你去旅行。小明和小紅還剩下n天...