description
小q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數
字1,2,3….進行標號。電路板的各個節點由若干不相交的導線相連線,且對於電路板的任何兩個節點,都存在且僅存在一條通路(通路指連線兩個元件的導線序列)。在電路板上存在乙個特殊的元件稱為「激發器」。當激發器工作後,產生乙個激勵電流,通過導線傳向每乙個它所連線的節點。而中間節點接收到激勵電流後,得到資訊,並將該激勵電流傳向與它連線並且尚未接收到激勵電流的節點。最終,激烈電流將到達一些「終止節點」——接收激勵電流之後不再**的節點。激勵電流在導線上的傳播是需要花費時間的,對於每條邊e,激勵電流通過它需要的時間為te,而節點接收到激勵電流後的**可以認為是在瞬間完成的。現在這塊電路板要求每乙個「終止節點」同時得到激勵電路——即保持時態同步。由於當前的構造並不符合時態同步的要求,故需要通過改變連線線的構造。目前小q有乙個道具,使用一次該道具,可以使得激勵電流通過某條連線導線的時間增加乙個單位。請問小q最少使用多少次道具才可使得所有的「終止節點」時態同步?
input
第一行包含乙個正整數n,表示電路板中節點的個數。第二行包含乙個整數s,為該電路板的激發器的編號。接
下來n-1行,每行三個整數a , b , t。表示該條導線連線節點a與節點b,且激勵電流通過這條導線需要t個單位時
間output
僅包含乙個整數v,為小q最少使用的道具次數
sample input
3 1
1 2 1
1 3 3
sample output
2分析:
mmp,題意是啥
好了,明白了
做了幾道樹上dp
我先立下如此flag
樹形dp基本都是從葉子結點開始dp的
首先先想一下,最大的路徑權值是多少
貪心的思想,找到樹中權值最大的路徑,權值為w
目標最大權值就是ta了
因為如果目標權值=w+1,那一定能找到乙個多餘的操作
現在我們知道了目標狀態,
那麼怎麼求解呢
最壞情況下,對於每個不滿足目標狀態的葉子結點,
修改與ta直接相連的邊,這就是最大步數了
如果要減少步數,那修改操作就要盡量靠近根
那我們從葉子結點向上遞推一遍
設f[i]表示以i為根的子樹中,葉節點到i的最大值
不明白就看圖:
注意t的範圍,開ll
這裡寫**片
#include
#include
#include
#define ll long long
using
namespace
std;
const
int n=500010;
struct node;
node way[n<<1];
int n,root,tot=0,st[n],mx=0;
ll f[n],ans=0;
ll max(ll a,ll b)
void add(int u,int w,int z)
void dfs(int now,int fa)
}for (i=st[now];i;i=way[i].nxt)
if (way[i].y!=fa)
ans+=f[now]-f[way[i].y]-way[i].v;
}int main()
dfs(root,0);
printf("%lld",ans);
return
0;}
BZOJ 1060 ZJOI2007 時態同步
time limit 10 sec memory limit 162 mb submit 3380 solved 1356 submit status discuss description 小q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數 字1,2,...
BZOJ1060 ZJOI2007 時態同步
小q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數 字1,2,3 進行標號。電路板的各個節點由若干不相交的導線相連線,且對於電路板的任何兩個節點,都存在且僅 存在一條通路 通路指連線兩個元件的導線序列 在電路板上存在乙個特殊的元件稱為 激發器 當激發器工...
BZOJ1060 ZJOI2007 時態同步
bzoj1060 zjoi2007 時態同步 小q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數字1,2,3 進行標號。電路板的各個節點由若干不相交的導線相連線,且對於電路板的任何兩個節點,都存在且僅存在一條通路 通路指連線兩個元件的導線序列 在電路板上...