나무와 나무의 무게 중심의 직경

아마도 더 나은 독서 경험

나무의 무게 중심

나무의 무게 중심의 정의는
그 루트 노드가 가장 큰 하위 트리 노드의 수를 최소로 포함 된 경우 때문에, 이러한 노드를 찾을 수

해결책은 간단하다, 다만 루트 노드로 노드를 끌어와 자식으로 그의 아버지가 나무에 대한 답변에 대해 생각 후 모두 완료 아들을 고려할 때 다음의 점을 계산

놀이의 두 종류

int dfs (int x,int fa,int m)
{
    son[x]=1,ms[x]=0;//ms max_num_of_son
    int tans=2000;
    for (int e=head[x];e;e=nxt[e]){
        if (to[e]==fa||vis[to[e]])  continue;
        int t=dfs(to[e],x,m);
        if (ms[tans]>ms[t]) tans=t;
        son[x]+=son[to[e]];
        ms[x]=max(ms[x],son[to[e]]);
    }
    ms[x]=max(ms[x],m-son[x]);
    if (ms[tans]>ms[x]) tans=x;
    return tans;
}

int ans;
void dfs (int x,int fa,int m)
{
    son[x]=1,ms[x]=0;
    for (int e=head[x];e;e=nxt[e]){
        if (to[e]==fa||vis[to[e]])  continue;
        dfs(to[e],x,m);
        son[x]+=son[to[e]];
        ms[x]=max(ms[x],son[to[e]]);
    }
    ms[x]=max(ms[x],m-son[x]);
    if (ms[ans]>ms[x])  ans=x;
    return ans;
}

나무의 직경

트리에서 가장 긴 경로를 찾는
요청 방법 것은 어려운 일이 아니다,의 전환점의 직경과 같은 점을 고려
메모 경로와 두 번째로 큰 최대 경로
를 모두 할 수있는 모든 노드의 합을 비교하는

최대 경로를 저장 한 다음 현재 경로 플러스의 최대 경로 비교할 사실은 수 와서
그하면 현재 경로가 두 번째로 큰 이상의 경로의 경로가 있는지 여부를 확인하는 것입니다

void dfs(int x,int fa) {
    f[x]=1;
    for (int e=head[x];e;e=nxt[e]){
        if (to[e]==fa)  continue;
        dfs(to[e],x);
        ans=max(ans,f[x]+f[to[e]]+w[e]);
        f[x]=max(f[x],f[to[e]]+w[e]);
    }
}

아주 넣어 위치를 이해하거나 오류가 발생하지 않으면 저를 수정하시기 바랍니다
만약 당신이 좋아하면, 당신이 그것에 대해 칭찬의 컬렉션을 가리 키도록 할 수 있습니다,

추천

출처www.cnblogs.com/Morning-Glory/p/11481659.html