TJOI2019 大中鋒的遊樂場

2021-10-03 07:25:22 字數 2588 閱讀 1315

大中鋒正在乙個遊樂場裡玩耍。遊樂場裡有很多娛樂設施,娛樂設施之間相互有道路相連,經過每一條路都需要花費一定的時間。為了方便遊客,每乙個娛樂設施旁都會配有乙個小賣部,一部分小賣部會銷售可樂,另一部分會銷售漢堡。

由於大中鋒十分貪吃,所以每當他走到乙個娛樂設施,他都會先去購買一杯可樂或乙個漢堡,並把它們吃掉。但如果大中鋒吃掉的漢堡數量比他喝掉的可樂數量多於 kk ,那他就會感到很渴;如果喝掉的可樂數量比吃掉的漢堡數量多於 kk ,那他就會感到很餓。

現在大中鋒正在第 aa 個娛樂設施,他想前往第 bb 個娛樂設施,但在他前進的路途中他不希望自己很渴或很餓。大中鋒想知道自己在路上少花費多少時間。但由於大中鋒很懶惰,他不想思考這個問題。你能幫助他解決這個問題嗎?

注意:大中鋒非常貪吃,所以他到達每個點的第一件事是去吃(或者喝),才考慮其他的事情,所以在起始點和終點他都會去買漢堡(可樂),你也需要保證在這兩個點他不會感到很餓或者很渴。

多樣例輸入,第一行輸入乙個正整數 tt 表示樣例數。

對於每乙個樣例:

第一行三個數字 n,m,kn,m,k , nn 代表遊樂場一共有多少個娛樂設施, mm 代表遊樂場一共有多少條道路, kk 的意義如題麵中所述。接下來有一行 nn 個數字,第 ii 個數字代表第 ii 個小賣部銷售的是什麼, 11 代表可樂, 22 代表漢堡。接下來有 mm 行輸入,每行三個數字 p,q,tp,q,t ,代表從第 pp 個娛樂設施到第 qq 個娛樂設施有一條雙向道路,通過這條道路需要花費 tt 單位時間。最後一行有兩個整數 a,ba,b ,代表大中鋒想從娛樂設施 aa 前往娛樂設施 bb 。

每組樣例輸出一行整數 tt ,代表大中鋒在路上既不會感到很渴也不會感到很餓的情況下,從娛樂設施 aa 到娛樂設施 bb花費的最少時間,如果無法達到,輸出 -1−1 。

輸入 #1 複製

12 1 1

1 11 2 1

1 2輸出 #1 複製

-1輸入 #2 複製

12 1 2

1 11 2 1

1 2輸出 #2 複製

1說明/提示

資料範圍

對於 30%30% 的資料, n\leq 50,m\leq 1000n≤50,m≤1000

對於 100%100% 的資料, n\leq 10000,m\leq 100000,k\leq 10,t\leq 10000n≤10000,m≤100000,k≤10,t≤10000

對於所有資料,保證 t ≤ 10t≤10 ,且每個樣例點的大資料不超過 22 個。

路徑不一定是簡單路徑

大中鋒可以多次經過乙個節點,同時每次都會取得漢堡/可樂

如果沒有可樂漢堡的限制,就是一道很簡單的最短路,所以我們也考慮在最短路上做文章。對於每個點,有效狀態是有限的。用ca表示喝了可樂的數量,用cb表示吃了漢堡的數量,有效的狀態點其實是節點數量(2k + 1)×(2k+1) 個。所以我們在進行最短路的時候儲存dist[i][j]的值。i表示到達第i個 節點,j表示(ca - cb) == j,然後進行最短路即可。

#include

#define ll long long

using

namespace std;

const

int n =

10050

,k =

11,v = n *

21,e =

100050*21

*2;int to[e]

,dis[e]

,ne[e]

,he[v]

,_k;

void

add(

int x,

int y,

int z)

int t;

int cnt;

int qa,qb,start;

int n,m,k,tp[n]

,p1[n]

,p2[n]

[k],p3[n]

[k];

intgetp

(int x,

int t)

ll dis[v]

,ans,inf =

1ll<<61;

struct node

}tmp;

priority_queueheap;

void

dij()}

}}intmain()

for(i =

1; i <= n;

++i)

}memset

(he,0,

sizeof

(int)*

(cnt+5)

);while

(m--

)swap

(x,y)

;for

(i =

-k; i <= k;

++i)

} cin>>qa>>qb;

start =

getp

(qa,tp[qa]);

dij();

ans = inf;

for(i =

-k; i <= k;

++i)

if(ans == inf)

puts

("-1");

else cout<}return0;

}

TJOI2019 大中鋒的遊樂場 最短路 DP

tjoi2019 大中鋒的遊樂場 題目本質要求的還是最短路,但因為有第二維權值 汽水看成 1 漢堡看成 1 的限制,我們在最短路的基礎上加上一維 f i j 表示到達 i 節點,權值為 j 的最短路長度,然後像正常最短路那樣轉移,最後取終點所有狀態的最小值即可。include include inc...

TJOI2019 甲苯先生和大中鋒的字串

有個叫asuldb的神仙來嘲諷我 說這題sam水題,而且sa過不了 然後我就用sa過了 顯然是乙個height陣列上長為k的滑塊,判一下兩邊,差分一下就可以了 include cstdio include cstring include iostream include algorithm usin...

TJOI2019 甲苯先生和大中鋒的字串

有個叫asuldb的神仙來嘲諷我 說這題sam水題,而且sa過不了 然後我就用sa過了 顯然是乙個height陣列上長為k的滑塊,判一下兩邊,差分一下就可以了 include cstdio include cstring include iostream include algorithm usin...