【樹的遍曆】時態同步

來源:互聯網
上載者:User

Description小Q在電子工藝實習課上學習焊接電路板。一塊電路板由若干個元件組成,我們不妨稱之為節點,並將其用數字1,2,3….進行標號。電路板的各個節點由若干不相交的導線相串連,且對於電路板的任何兩個節點,都存在且僅存在一條通路(通路指串連兩個元件的導線序列)。在電路板上存在一個特殊的元件稱為“激發器”。當激發器工作後,產生一個激勵電流,通過導線傳向每一個它所串連的節點。而中間節點接收到激勵電流後,得到資訊,並將該激勵電流傳向與它串連並且尚未接收到激勵電流的節點。最終,激烈電流將到達一些“終止節點”——接收激勵電流之後不再轉寄的節點。激勵電流在導線上的傳播是需要花費時間的,對於每條邊e,激勵電流通過它需要的時間為te,而節點接收到激勵電流後的轉寄可以認為是在瞬間完成的。現在這塊電路板要求每一個“終止節點”同時得到激勵電路——即保持時態同步。由於當前的構造並不符合時態同步的要求,故需要通過改變連接線的構造。目前小Q有一個道具,使用一次該道具,可以使得激勵電流通過某條串連導線的時間增加一個單位。請問小Q最少使用多少次道具才可使得所有的“終止節點”時態同步?Input第一行包含一個正整數N,表示電路板中節點的個數。第二行包含一個整數S,為該電路板的激發器的編號。接下來N-1行,每行三個整數a , b , t。表示該條導線串連節點a與節點b,且激勵電流通過這條導線需要t個單位時間。Output僅包含一個整數V,為小Q最少使用的道具次數。Sample Input311 2 11 3 3Sample Output2【資料規模】對於40%的資料,N ≤ 1000對於100%的資料,N ≤ 500000對於所有的資料,te ≤ 1000000

一次後續遍曆,每次讓所有的子樹都和“最慢”的結點保持同步,把所有的這樣的代價累加即可。
無奈在Windows系統下爆棧,只能過70分。

#include <cstdio>#include <cstdlib>#include <algorithm>#include <string>typedef long long int64;const int maxN = 500010;const int64 INF = 0x3f3f3f3f3f3f3f3fLL;struct Edge{    int u, v; int64 d; Edge *next; Edge() {}    Edge(int u, int v, int64 d, Edge *next):        u(u), v(v), d(d), next(next) {}} *edge[maxN];bool marked[maxN]; int n, S; int64 dist[maxN], ans;void Dfs(int &u){    int64 Max = 0; dist[u] = 0; marked[u] = 1;    for (Edge *p = edge[u]; p; p = p -> next)    if (!marked[p -> v])    {        Dfs(p -> v);        Max = std::max(Max, p -> d + dist[p -> v]);    }    for (Edge *p = edge[u]; p; p = p -> next)    if (!marked[p -> v])    {        ans += Max - dist[p -> v] - p -> d;        dist[p -> v] = Max - p -> d;    }    dist[u] = Max; marked[u] = 0;    return;}inline int getint(){    int res = 0; char tmp;    while (!isdigit(tmp = getchar()));    do res = (res << 3) + (res << 1) + tmp - '0';    while (isdigit(tmp = getchar()));    return res;}int main(){    freopen("synch.in", "r", stdin);    freopen("synch.out", "w", stdout);    n = getint(); S = getint();    for (int i = 1; i < n; ++i)    {        int u = getint(), v = getint();        int64 d = getint();        edge[u] = new Edge(u, v, d, edge[u]);        edge[v] = new Edge(v, u, d, edge[v]);    }    Dfs(S);    printf("%I64d\n", ans);    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.