poj1655 求樹的重心
阿新 • • 發佈:2019-02-17
題意:求樹的重心。
解法:對樹進行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;
}