洛谷 P2680 運輸計畫

2021-07-24 08:04:04 字數 3463 閱讀 1742

公元 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 號星球。

輸出格式:

輸出檔案只包含乙個整數,表示小 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
所有測試資料的範圍和特點如下表所示

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

預處理出詢問的lca,列舉在那條路建立蟲洞,dfs暴力更新到根節點的距離,可以得50分。

#include#include#includeusing namespace std;

const int n=300005;

int n,m,cnt,ans=1e9+7,hd[n],dep[n],f[n][21],dis[n],ban;

struct edge

v[2*n];

struct node

e[n];

void addedge(int x,int y,int z,int id)

void init(int u,int fa)

int lca(int x,int y)

void dfs(int u,int fa)

}int main()

init(1,0);

for(int i=1;i<=18;i++)

for(int j=1;j<=n;j++)

f[j][i]=f[f[j][i-1]][i-1];

for(int i=1;i<=m;i++)

for(int i=1;i<=n-1;i++)//刪邊

printf("%d\n",ans);

return 0;

}

迷之二分答案,轉變為可行性問題。

如果所有的邊都比lim小於等於,一定可行,否則從兩端點搜尋到lca,將經過的邊++,如果有一條邊所有的計畫都經過了,且mx-邊權<=lim,就可行。80分。

#include#include#include#includeusing namespace std;

const int n=300005;

int n,m,cnt,hd[n],dep[n],f[n][21],dis[n],ac[n],val[n];

struct edge

v[2*n];

struct node

e[n];

void addedge(int x,int y,int id)

void init(int u,int fa)

}int getlca(int x,int y)

void dfs(int u,int ban)

if(sum==0)

return 1;

for(int i=1;i<=n-1;i++)

if(ac[i]==sum&&mx-val[i]<=lim)

return 1;

return 0;

}int main()

init(1,0);

for(int i=1;i<=17;i++)

for(int j=1;j<=n;j++)

f[j][i]=f[f[j][i-1]][i-1];

for(int i=1;i<=m;i++)

while(l

想一想,每次都直接dfs太zz了,可以把它們存起來,從根節點只dfs一遍,就是差分(不懂),詳見**。(終於ac了)

#include#include#include#includeusing namespace std;

const int n=300005;

int n,m,cnt,hd[n],dep[n],f[n][21],dis[n],ac[n],val[n],hh[n];

struct edge

v[2*n];

struct node

e[n];

void addedge(int x,int y,int id)

void init(int u,int fa)

}int getlca(int x,int y)

int dfs(int u,int fa)

return t+hh[u];

}bool pd(int lim)

if(sum==0)

return 1;

dfs(1,0);

for(int i=1;i<=n-1;i++)

if(ac[i]==sum&&mx-val[i]<=lim)

return 1;

return 0;

}int main()

init(1,0);

for(int i=1;i<=17;i++)

for(int j=1;j<=n;j++)

f[j][i]=f[f[j][i-1]][i-1];

for(int i=1;i<=m;i++)

while(l

P2680 運輸計畫

好久沒更新部落格了,更一篇吧 qwq 傳送門要求我們讓路徑的最大時間最小 這很二分答案 可以二分答案 mid 然後想辦法 o n 去檢查答案是否合法 可以記錄出路徑長度大於 mid 的路徑,盡量在這些路徑的交集部分建造黑洞 顯而易見 我們可以用邊差分 diff i 來記錄這條邊被幾個大於 mid 的...

P2680 運輸計畫

公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球...

P2680 運輸計畫

最短的最長鏈,二分答案,然後進行邊差分 大常數選手表示倍增lca卡不過去啊 只好面向資料點變成了一下qaq 學會tarjan求lca再來修吧 或許學會樹剖後?luogu judger enable o2 includeusing namespace std struct nodeeg 300200 ...