Wek7 商業線與經濟線Dij

2021-10-04 22:49:24 字數 3163 閱讀 3563

問題描述:

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

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

解題思路:

由於最多只能坐一站商業線,所以從起點到終點的乘坐方式有兩種,一種是不乘商業線直接到終點,還有一種是坐一站商業線到終點,可採用列舉商業線的方法,計算起點到u的最短路以及v到終點的最短路再加上該商業線所花費的時間,(注意這裡路徑都是雙向的),再與不乘商業線的最短路徑進行比較,記錄最短路徑即可。

步驟:• 以起點為源點求單源最短路,得到 dis1 陣列

• 再以終點為源點求單源最短路,得到 dis2 陣列

• 列舉商業線(u, v, w),取 min,最終再與不走商業線的答案取min

求最短路徑採用dijkstra演算法。

note::!!inf不要設成int_max,因為很容易溢位成負數,導致結果錯誤。

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 4

25

實驗**:

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int inf =

1e9+7;

int head[

550]

;int n,s,e;

struct edge

;struct sedge

;edge edge[

2050];

//經濟線

sedge sedge[

1050];

//商業線

int secnt,ecnt;

int s_dis[

550]

;//儲存從s到i的最短距離

int e_dis[

550]

;//儲存從e到i的最短距離

int vis[

550]

;int pre[

550]

;//記錄每個點的前驅節點

int back[

550]

;//記錄每個點的後繼節點

int path[

550]

;//儲存路徑

int length;

void

initialize()

}void

insert_edge

(int u,

int v,

int w)

void

insert_sedge

(int u,

int v,

int w)

priority_queueint,

int>

>q;

void

dijkstra

(int s,

int* dis,

int* pre)}}

}void

getans()

if(s_dis[v]

+w+e_dis[u]

(ansu==0)

}else

for(

int i=size-

1;i>-1

;i--

) path[length++

]=temp[i]

; path[length++

]=ansu;

path[length++

]=ansv;

s=ansv;

while

(back[s])}

for(

int i=

0;i)printf

("\n");

if(ansu!=0)

printf

("%d\n"

,ansu)

;else

printf

("ticket not used\n");

printf

("%d\n"

,ans);}

intmain

(void

)scanf

("%d"

,&busi)

;for

(int i=

1;i<=busi;i++

)getans()

;}return0;

}

Part 7 曲線積分

分割,取近似,作和,取極限。極限存在,與分割法無關 空間曲線弧長 加權 線密度 的平面 權連續的 曲線。總結成一般的點函式形式 int f p mathrm ds lim limits sum limits nf p i delta s i sum limits n m m k 的上確界 分段光滑曲...

上海地鐵7號線「掀起蓋頭」

上海地鐵7號線 掀起蓋頭 預計年底正式開通 據了解,7號線的設計運營能力為日均承受100萬客流,僅次於1號 2號線。然而,原定於11月底試運營,現在尚不能確定具體日期。目前全線車站正全力進行出入口和風井裝修,控制中心 停車場 沿線車站和區間配合車輛上線除錯,已完成17列動車的除錯。今年年底前開通的7...

基礎篇 7 多線執行緒 物件實現爬蟲

import time import random import re import os from urllib import request import requests import threading from lxml import etree from queue import que...