1. 程式人生 > >poj1655 求樹的重心

poj1655 求樹的重心

題意:求樹的重心。

解法:對樹進行dfs,記錄對於某個節點它的子樹大小son[u],在dfs的時候可以處理出來這個點的所有子樹節點個數的最大值Max,而n-son[u]可以處理出它父節點延伸出去的節點數目,那麼答案便可以找到了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 10000000
using namespace std;
const int N=20005;
int head[N],top=0;
int n;
int son[N];
int ans,point;
struct
Edge { int v,next; }edge[N*2]; void init() { memset(head,-1,sizeof(head)); top=0; memset(son,0,sizeof(son)); ans=inf; } void addedge(int u,int v) { edge[top].v=v; edge[top].next=head[u]; head[u]=top++; } void dfs(int u,int fa) { son[u]=1; int Max=0; for(int
i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(v==fa)continue; dfs(v,u); son[u]+=son[v]; Max=max(Max,son[v]); } int tmp=max(Max,n-son[u]); if(tmp<ans||tmp==ans&&u<point){ ans=tmp; point=u; } } int main() { int
T; scanf("%d",&T); while(T--) { init(); scanf("%d",&n); int u,v; for(int i=1;i<n;i++){ scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); } dfs(1,-1); printf("%d %d\n",point,ans); } return 0; }