CF1187Eツリーは、トランスデューサGenfa絵画

思考

典型的なツリー\(DP \)

しかし、一度ではない(DFS \)\答えを得るために、

ルートを変更するには、法律を使って

言葉の個人的な理解によると、

他のルートでは法律があります

選択した開始点にツリーを行います\(DP \)

(ANS [1] \)\ //と\(1 \)出発点として応答値

我々缶\(O(1)\)計算\(ANS [sonof1] \)

感じ、そのツリー\(DP \)まあ

実現

この質問のために

私たちは最初の\(1 \)ルートについて

書きやすいです

inline void dfs(int x,int fa)
{
    size[x] = 1;
    for(reg i = head[x];i;i = edge[i].next)
    {
        int v = edge[i].v;
        if(v == fa) continue;
        dfs(v,x);
        size[x] += size[v];
    }
    ans[1] += size[x];
}

トランスファーケース

まず写真を来ります


以下のための\(X \)

\(ANS [Y] = F [xson1] + F [xson2] + F [xson3] +サイズ[X] +サイズ[Y] + F [yson1] + F [yson2] + F [yson3] \)

\(サイズ[X] = N-サイズ[Y] \)

\(ANS [Y] = ANS [X] + Nサイズ[Y] -size [Y] \)

\(コード\)

オープン\(LONGLONG \)

#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define reg register int
#define isdigit(x) ('0' <= x&&x <= '9')
template<typename T>
inline T Read(T Type)
{
    T x = 0,f = 1;
    char a = getchar();
    while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();}
    while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();}
    return x * f;
}
const int MAXN = 2e5 + 10;
struct node
{
    int v,next;
}edge[MAXN << 1];
int cnt,size[MAXN],head[MAXN];
long long pr,ans[MAXN];
inline void addedge(int u,int v)
{
    edge[++cnt].v = v;
    edge[cnt].next = head[u];
    head[u] = cnt;
}
inline void dfs(int x,int fa)
{
    size[x] = 1;
    for(reg i = head[x];i;i = edge[i].next)
    {
        int v = edge[i].v;
        if(v == fa) continue;
        dfs(v,x);
        size[x] += size[v];
    }
    ans[1] += size[x];
}
inline void dfs2(int x,int fa)
{
    for(reg i = head[x];i;i = edge[i].next)
    {
        int v = edge[i].v;
        if(v == fa) continue;
        ans[v] = ans[x] + size[1] - 2 * size[v];
        pr = max(pr,ans[v]);
        dfs2(v,x);
    }
}
int main()
{
    int n = Read(1);
    for(reg i = 1;i < n;i++)
    {
        int u = Read(1),v = Read(1);
        addedge(u,v),addedge(v,u);
    }
    dfs(1,0);
    dfs2(1,0);
    printf("%lld",pr);
    return 0;
}

//f[x] = n + f[xson]

//f[y] = n + f[yson] = f[x] + n - 2 * size[y] 

おすすめ

転載: www.cnblogs.com/resftlmuttmotw/p/11811700.html