Godfather(POJ3107)——求樹的重心(遞歸)
阿新 • • 發佈:2017-10-30
space ble 子節點 sta target log targe ios struct
先貼上原題的鏈接
?傳送門?
題目大意是給定一個無根樹,使得去掉一個點之後,剩下子樹的節點數的最大值最小,也就是求樹的重心。求樹的重心的話,只需要設一個點為跟,然後遞歸下去,求出son[i](表示以i為根節點的子樹的節點數量)以及除了以此節點為根節點的子樹的剩下的節點數,用f數組來表示。然後讓max(f[pos],son[posson],(posson為pos的子節點)最小的節點輸出就可以了。以下是程序
#include<iostream> #include<cstdio> using namespace std; struct nob{ int sta,ed,jump; }a[100005]; int n,jump[50005],tot,son[50005],f[50005],mina=1e9; void add(int sta,int ed) { tot++; a[tot].ed=ed; a[tot].jump=jump[sta]; jump[sta]=tot; } void dfs(int pos,int fa){ son[pos]=1; for (int i=jump[pos]; i; i=a[i].jump){ if (a[i].ed==fa) continue; dfs(a[i].ed,pos); son[pos]+=son[a[i].ed]; } f[pos]=n-son[pos]; for (int i=jump[pos]; i; i=a[i].jump){ if (a[i].ed==fa) continue; f[pos]=max(f[pos],son[a[i].ed]); } mina=min(f[pos],mina); } int main(){ scanf("%d",&n); for (int i=1,x,y; i<n; i++){ scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(1,0); for (int i=1; i<=n; i++) if (f[i]==mina) printf("%d ",i); return 0; }
Godfather(POJ3107)——求樹的重心(遞歸)