POJ1655 Balancing Act——树的重心,Dfs

本题求的是树的重心。树的重心定义为删掉这个节点之后将树分成几部分使得这几部分中点个数的最大值最小。.
{$M 100000000}
Program POJ1655;
Const 
      maxn=20005;
Var 
    i,j,k,m,n,t             :Longint;
    father,size             :Array[0..maxn]of Longint;
    pre,other,last          :Array[0..maxn*2]of Longint;
    ans						:Array[0..maxn]of Longint;
	
Procedure Dfs(i:Longint);
var j,k:Longint;
begin
	j:=last[i];
	size[i]:=1;
	while j<>0 do 
		begin
			k:=other[j];
			if k<>father[i] then 
				begin
					father[k]:=i;
					Dfs(k);
					inc(size[i],size[k]);
					if size[k]>ans[i] then ans[i]:=size[k];
				end;
			j:=pre[j];
		end;
	if n-size[i]>ans[i] then ans[i]:=n-size[i];
end;
	
BEGIN
     readln(t);
     while t>0 do
           begin
                dec(t);k:=0;
                readln(n);
                fillchar(father,sizeof(father),0);
				fillchar(ans,sizeof(ans),255);
				fillchar(last,sizeof(last),0);
                for i:=1 to n-1 do
                    begin
						readln(m,j);
						inc(k);pre[k]:=last[m];last[m]:=k;other[k]:=j;
						inc(k);pre[k]:=last[j];last[j]:=k;other[k]:=m;
                    end;
			Dfs(1);
			m:=1;
			for i:=2 to n do 
				if ans[m]>ans[i] then m:=i;
				writeln(m,' ',ans[m]);
           end;
END.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值