noip2015 運輸計划


P2680 運輸計划

    • 59通過
    • 2K提交
  • 題目提供者2014白永忻
  • 標簽圖論NOIp提高組2015
  • 難度提高+/省選-

提交該題 討論 題解 記錄

最新討論

  • 時限改寬點吧……
  • 語文要學好!
  • 似乎會棧爆?》

題目背景

公元 2044 年,人類進入了宇宙紀元。

題目描述

L 國有 n 個星球,還有 n-1 條雙向航道,每條航道建立在兩個星球之間,這 n-1 條

航道連通了 L 國的所有星球。

小 P 掌管一家物流公司,該公司有很多個運輸計划,每個運輸計划形如:有一艘物

流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球去。顯然,飛船駛過一條航道 是需要時間的,對於航道 j,任意飛船駛過它所花費的時間為 tj,並且任意兩艘飛船之 間不會產生任何干擾。

為了鼓勵科技創新,L 國國王同意小 P 的物流公司參與 L 國的航道建設,即允許小 P 把某一條航道改造成蟲洞,飛船駛過蟲洞不消耗時間。

在蟲洞的建設完成前小 P 的物流公司就預接了 m 個運輸計划。在蟲洞建設完成后, 這 m 個運輸計划會同時開始,所有飛船一起出發。當這 m 個運輸計划都完成時,小 P 的 物流公司的階段性工作就完成了。

如果小 P 可以自由選擇將哪一條航道改造成蟲洞,試求出小 P 的物流公司完成階段 性工作所需要的最短時間是多少?

輸入輸出格式

輸入格式:

 

輸入文件名為 transport.in。

第一行包括兩個正整數 n、m,表示 L 國中星球的數量及小 P 公司預接的運輸計划的

數量,星球從 1 到 n 編號。

接下來 n-1 行描述航道的建設情況,其中第 i 行包含三個整數 ai, bi 和 ti,表示第

i 條雙向航道修建在 ai 與 bi 兩個星球之間,任意飛船駛過它所花費的時間為 ti。 接下來 m 行描述運輸計划的情況,其中第 j 行包含兩個正整數 uj 和 vj,表示第 j 個

運輸計划是從 uj 號星球飛往 vj 號星球。

 

輸出格式:

 

輸出文件名為 transport.out。

共 1 行,包含 1 個整數,表示小 P 的物流公司完成階段性工作所需要的最短時間。

 

輸入輸出樣例

輸入樣例#1:
6 3 
1 2 3 
1 6 4 
3 1 7 
4 3 6 
3 5 5 
3 6 
2 5 
4 5
輸出樣例#1:
11

說明

所有測試數據的范圍和特點如下表所示

請注意常數因子帶來的程序效率上的影響。

分析:注意到m個計划是同時進行的,那么就是求最大值中的最小值,很明顯,二分.二分一個答案m,因為我們二分的是最小值,那么大於m的一定不滿足要求,我們把這些路徑提出來,要使這些路徑都滿足要求,而蟲洞只能建一個,所以蟲洞要建在這些路徑的交上,也就是一條邊是這些不滿足要求的路徑的公共邊.

那么問題就是怎么求交?先把問題轉換一下,如果是在一個序列上求m個區間的交該怎么求?這個交的左邊一定有m-1個左端點,加上自己的左端點之后共有m個左端點,那么思路就出來了,給每個左端點賦值為1,然后利用前綴和,看哪個區間的端點的值為m,但是加了1之后是必須要減的,不然在這個交的后面可能還會出現交.實際上就是一個值轉移的過程,用左端點的值來覆蓋整個區間的值.那么轉移到樹上該怎么做呢?

一樣的,把邊的值給深度更大的點(防止葉子節點漏算),那么假設邊的左節點為u,右節點為v,那么cnt[u]++,cnt[v]++,cnt[lca(u,v)]-=2,相當於吃了就必須給我吐出來.那么cnt[u] += ∑cut[son[u]],實際上就對應了區間上的前綴和.

然后的問題就是怎么求lca,方法有很多,倍增,tarjan,樹剖......樹剖的預處理比較麻煩,但是很好寫.然后就是怎么計算兩個點之間的距離,這個可以在預處理的時候解決,計算每個點到根節點的距離d,然后假設一條邊的左端點為u,右端點為v,那么dist = d[u] + d[v] - 2*d[lca(u,v)],反正要記住一點,樹上求路徑要想起lca.

但是即使是這樣還是不能A這道題,會TLE一個點,因為常數因子會對算法效率帶來影響,然后我就不知道怎么辦了......一般在賽場上不會為了5分去想很長時間,除非很關鍵.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM