나무의 무게 중심
나무의 무게 중심의 정의는
그 루트 노드가 가장 큰 하위 트리 노드의 수를 최소로 포함 된 경우 때문에, 이러한 노드를 찾을 수
해결책은 간단하다, 다만 루트 노드로 노드를 끌어와 자식으로 그의 아버지가 나무에 대한 답변에 대해 생각 후 모두 완료 아들을 고려할 때 다음의 점을 계산
놀이의 두 종류
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]);
}
}
아주 넣어 위치를 이해하거나 오류가 발생하지 않으면 저를 수정하시기 바랍니다
만약 당신이 좋아하면, 당신이 그것에 대해 칭찬의 컬렉션을 가리 키도록 할 수 있습니다,