P1131 ZJOI2007 時態同步

2022-03-04 06:48:45 字數 1855 閱讀 4513

小 q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數字 1,2,3…進行標號。電路板的各個節點由若干不相交的導線相連線,且對於電路板的任何兩個節點,都存在且僅存在一條通路(通路指連線兩個元件的導線序列)。

在電路板上存在乙個特殊的元件稱為「激發器」。當激發器工作後,產生乙個激勵電流,通過導線傳向每乙個它所連線的節點。而中間節點接收到激勵電流後,得到資訊,並將該激勵電流傳向與它連線並且尚未接收到激勵電流的節點。最終,激烈電流將到達一些「終止節點」――接收激勵電流之後不再**的節點。

激勵電流在導線上的傳播是需要花費時間的,對於每條邊 e,激勵電流通過它需要的時間為 te,而節點接收到激勵電流後的**可以認為是在瞬間完成的。現在這塊電路板要求每乙個「終止節點」同時得到激勵電路――即保持時態同步。由於當前的構造並不符合時態同步的要求,故需要通過改變連線線的構造。目前小 q有乙個道具,使用一次該道具,可以使得激勵電流通過某條連線導線的時間增加乙個單位。請問小q最少使用多少次道具才可使得所有的「終止節點」時態同步?

輸入格式:

第一行包含乙個正整數 n,表示電路板中節點的個數。

第二行包含乙個整數 s,為該電路板的激發器的編號。

接下來 n−1行,每行三個整數 a,b,t。表示該條導線連線節點 a與節點 b,且激勵電流通過這條導線需要 t個單位時間。

輸出格式:

僅包含乙個整數 v,為小 q最少使用的道具次數。

輸入樣例#1:

3

11 2 1

1 3 3

輸出樣例#1:

2

對於 40%的資料, n≤1000

對於 100%的資料, n≤500000

對於所有的資料, te≤1000000

solution:

本題~不難~`~`。

我們隨便畫畫圖,很容易貪心的想到,最小的花費是長度最大的一條鏈,減去其它鏈的差的累加。

然後果斷寫,果然$wa$。(然而我並不知道為什麼會有問題。)

後面發現,直接處理到根節點的鏈會出現重邊(特別是可能多條鏈的直接父親不一樣),於是換個思路每次處理的是沒有訪問過的子樹中最大的一條鏈長度$-$它的其它鏈的長度,有一點樹形$dp$的意味。

最後遍歷完整棵樹,就能得到答案了。

**:

#include#define il inline

#define ll long long

#define max(a,b) ((a)>(b)?(a):(b))

#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

using

namespace

std;

const

int n=1000005

;int

n,s,h[n],to[n],net[n],t[n],cnt;

ll ans,maxn,p[n],tot;

bool

vis[n];

il int

gi()

il void add(int u,int v,int w)

il void prepare(int

x)il

void dfs(int

x)int

main()

prepare(s);

dfs(s);

cout

}

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 ...