1. 程式人生 > >Codeforces Round #485 (Div. 2) D. Fair BFS

Codeforces Round #485 (Div. 2) D. Fair BFS

Note

Let's look at the first sample.

To hold a fair in town 11 you can bring goods from towns 11 (00 coins), 22 (11 coin) and 44 (11 coin). Total numbers of coins is 22.

Town 22: Goods from towns 22 (00), 11 (11), 33 (11). Sum equals 22.

Town 33: Goods from towns 33 (00), 22 (11), 44 (11). Sum equals 22.

Town 44: Goods from towns 4

4 (00), 11 (11), 55 (11). Sum equals 22.

Town 55: Goods from towns 55 (00), 44 (11), 33 (22). Sum equals 33.

題意:

一家公司準備在n個城鎮舉辦展覽,每個城鎮僅僅生產一種產品,n個城鎮加起來有且僅有k個,公司在每個城鎮舉辦展覽,且每個城鎮至少需要s個產品。u城鎮為了收集v城鎮的產品,需要走d(u,v)的最短路程,問每個城鎮都舉辦展覽的話,每個城鎮至少需要走多少路程。

這裡需要注意一點,就是假設城鎮1收集城鎮3的產品,會途徑城鎮2,那麼最短路程的計算需要計算d(1->2) + d(1->3)的,而不是計算d(1->2->3)。

給定n,m,k,s分別表示n個城鎮,m條馬路,k表示n個城鎮生產的產品總工k種,s表示每個城鎮舉辦展覽至少需要s個產品。

接下來n個數分別表示每個城鎮生成的產品型別

接下來m條邊,u,v表示城鎮u到城鎮v之間有一條路。

思路:

一開始想著dis[i][k],表示城鎮i到產品k的最短路,考慮列舉i,然後跑圖去找最近的產品k在哪個城市,這樣的複雜度是n*n,GG。

中途吃個飯考慮了許久,解法是列舉產品k,BFS去跑圖,算出每個城市距離產品k的最短路徑,這樣跑圖的時候因為從城鎮產品型別k開始,bfs下去維護dis[i][k]的值就好了。複雜度就是k*m*log(m),貌似這個bfs的複雜度取決於邊數,有錯的話留言批評我一下謝謝。

那麼拿到了每個城鎮到產品k的最近距離,排序每個城鎮的前s小就好了。

程式碼: