BOI 2002 雙調路徑

2022-08-28 10:36:10 字數 1591 閱讀 8247

城市的道路是雙向的,每條道路有固定的旅行時間以及需要支付的費用。路徑由連續的道路組成。總時間是各條道路旅行時間的和,總費用是各條道路所支付費用的總和。同樣的出發地和目的地,如果路徑a比路徑b所需時間少且費用低,那麼我們說路徑a比路徑b好。對於某條路徑,如果沒有其他路徑比它好,那麼該路徑被稱為最優雙調路徑。這樣的路徑可能不止一條,或者說根本不存在。

給出城市交通網的描述資訊,起始點和終點城市,求最優雙條路徑的條數。城市不超過100個,邊數不超過300,每條邊上的費用和時間都不超過100。

輸入描述

第一行給出有多少個點,多少條邊,開始點及結束點.

輸出描述

有多少條雙調路徑

樣例輸入

4 5 1 4

2 1 2 1

3 4 3 1

2 3 1 2

3 1 1 4

2 4 2 4

樣例輸出 sample output

2

本題用的一種巧妙的做法。顯然這題是一道單源最短路問題,用spfa或是dijkstra都是可以的。但是我們要進行spfa的是對於某個固定的花費下的所用的時間。也就是程式當中的dist[city][cost] = time這個在注釋裡有寫。因為費用最大是100,所以cost開到二維陣列開出來不會爆記憶體的!

本題有幾個要注意的小問題:(有些是我愚蠢的錯誤)

因為是無向邊edge陣列記得開2*maxm

有的變數名字注意一下哈:time叫t,target也叫t,那不是很愚蠢啊……

1 #include 2

using

namespace

std;

3const

int maxn = 100 + 1;4

const

int maxm = 300 + 1;5

int n, m, s, t, edgecount = 0, mintime = 0x3f3f3f3f

, head[maxn];

6int dist[maxn][maxn*maxn];

7bool vis[maxn][maxn*maxn];

8struct

edge

9edge[maxm*2

];12

struct

node13;

16void insert(int u, int v, int w, int

t)17

;19 head[u] =edgecount;20}

21void

spfa()

22);

28 dist[s][0] = 0

;29 vis[s][0] = true;30

while (!q.empty())

31);47}

48}49}

50}51}

52int

main()

5363

spfa();

64int ans = 0;65

for (int i = 0; i <= maxn*n; i++)

6673 cout << ans <74return0;

75 }

檔案路徑 BOI2015

對於每個葉子節點問 是否能構造出一條從根節點出發以該節點為終點的長為 k 的路徑 設有乙個葉子節點 x 情況1根到 x 的路徑長等於 k 那顯然答案就是yes 情況2走了一次附加的有向邊使得路徑長為 k 考慮這條有向邊的終點在 由於走過這條有向邊之後還要從它的終點走到 x 所以有向邊的終點一定要是 ...

BOI2007 Sequence 序列問題

對於乙個給定的序列a1,an,我們對它進行乙個操作reduce i 該操作將數列中的元素ai和ai 1用乙個元素max ai,ai 1 替代,這樣得到乙個比原來序列短的新序列。這一操作的代價是max ai,ai 1 進行n 1次該操作後,可以得到乙個長度為1的序列。我們的任務是計算代價最小的redu...

題解 BOI2003 團夥

其實綠色有點看高了此題。此題只需要加乙個 敵人的敵人就是我的朋友 就可以了,而只要乙個人x與另一人y是敵人,x就和y的第乙個敵人是朋友就可以將x弄進y的敵人團夥,而y的敵人將全在那個團夥中 下面是 includeusing namespace std int bcj 5010 int e 5010 ...