小q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數字1,2,3….進行標號。電路板的各個節點由若干不相交的導線相連線,且對於電路板的任何兩個節點,都存在且僅存在一條通路(通路指連線兩個元件的導線序列)。
在電路板上存在乙個特殊的元件稱為「激發器」。當激發器工作後,產生乙個激勵電流,通過導線傳向每乙個它所連線的節點。而中間節點接收到激勵電流後,得到資訊,並將該激勵電流傳向與它連線並且尚未接收到激勵電流的節點。最終,激烈電流將到達一些「終止節點」――接收激勵電流之後不再**的節點。
激勵電流在導線上的傳播是需要花費時間的,對於每條邊e,激勵電流通過它需要的時間為te,而節點接收到激勵電流後的**可以認為是在瞬間完成的。現在這塊電路板要求每乙個「終止節點」同時得到激勵電路――即保持時態同步。由於當前的構造並不符合時態同步的要求,故需要通過改變連線線的構造。目前小q有乙個道具,使用一次該道具,可以使得激勵電流通過某條連線導線的時間增加乙個單位。請問小q最少使用多少次道具才可使得所有的「終止節點」時態同步?
輸入格式:
第一行包含乙個正整數n,表示電路板中節點的個數。
第二行包含乙個整數s,為該電路板的激發器的編號。
接下來n-1行,每行三個整數a , b , t。表示該條導線連線節點a與節點b,且激勵電流通過這條導線需要t個單位時間。
輸出格式:
僅包含乙個整數v,為小q最少使用的道具次數。
輸入樣例#1:
3輸出樣例#1:11 2 1
1 3 3
2對於40%的資料,n ≤ 1000
對於100%的資料,n ≤ 500000
對於所有的資料,te ≤ 1000000
樹形dp
f[i]表示i節點到它的子節點的最遠距離。
f[son[i]]表示i的孩子到它(那個孩子)的子節點的最遠距離。
c[i]是i節點和子節點邊的權值
比如我們看節點2,f[2]=6,f[6]=0,c[2,6]=6,所以節點2到節點6的延遲為0.
f[2]-f[6]-c[2,6]=6-0-6=0;
比如我們看節點0,f[0]=8,f[2]=6,c[0,2]=2,所以節點0到節點2的延遲為0.
f[0]-f[2]-c[0,2]=8-6-2=0;
進行一波dfs,用f[i]記錄第i個節點到達最遠葉子節點的用時(用時最長的葉子節點).
從每個兒子v回溯回來時,如果從v下去到達最遠葉子節點用時更長,那就更新f[u],f[u]=max(f[u],f[v]+e[i].w),e[i].w是從u到v的用時。
這樣的話遍歷完u的所有兒子,答案就增加sigma( f[u]-f[e[i].to]-f[e[i].w )。
大概就是從葉子開始一層層地把兄弟節點統一了,再向上統一這個節點總共要加多少時間,一層層向父親彙總,回到根節點就得到了答案
1 #include2 inline int max(int a,intb)36 inline int
read()714
intn,root;
1516
struct edgee[1000010];
20int head[500010]=,cnt=1;
21 inline void add(int u,int v,int
w)22
28long
long f[500010]=,ans=0;
29void dfs(int u,int
fa)30
38for(int i=head[u];i;i=e[i].next)
39if(fa!=e[i].to)
40 ans+=f[u]-f[e[i].to]-e[i].w;41}
4243
intmain()
44
P1131 ZJOI2007 時態同步
小 q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數字 1,2,3 進行標號。電路板的各個節點由若干不相交的導線相連線,且對於電路板的任何兩個節點,都存在且僅存在一條通路 通路指連線兩個元件的導線序列 在電路板上存在乙個特殊的元件稱為 激發器 當激發器工...
P1131 ZJOI2007 時態同步
樹形dp 有一棵樹,有 n 個節點,n 1 條邊,每條邊都有乙個權值。要求每個葉子結點到根節點的邊權相同,求最少的改動數量 不是次數 看不懂的話,走傳送門 很顯然是 dp 我也不知道是怎麼想到的 我們可以想一想,如果從根節點出發,向下維護會有諸多不便。所以我們可以倒著思考,從每乙個葉子結點開始進行維...
P1131 ZJOI2007 時態同步
include define maxn 1000005 using namespace std struct edge edge maxn int n,s,a,b,t,maxn maxn cnt,head maxn maxn儲存到子節點的最大邊權 long long ans 注意,答案要用long ...