加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

poj 1655 Balancing Act(树的重心)

发布时间:2020-12-13 20:44:48 所属栏目:PHP教程 来源:网络整理
导读:Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9913 Accepted: 4069 Description Consider a tree T with N (1 = N = 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one o

Balancing Act
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9913   Accepted: 4069

Description

Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or more trees. Define the balance of a node to be the size of the largest tree in the forest T created by deleting that node from T. 
For example,consider the tree: 


Deleting node 4 yields two trees whose member nodes are {5} and {1,2,3,6,7}. The larger of these two trees has five nodes,thus the balance of node 4 is five. Deleting node 1 yields a forest of three trees of equal size: {2,6},{3,7},and {4,5}. Each of these trees has two nodes,so the balance of node 1 is two. 

For each input tree,calculate the node that has the minimum balance. If multiple nodes have equal balance,output the one with the lowest number. 

Input

The first line of input contains a single integer t (1 <= t <= 20),the number of test cases. The first line of each test case contains an integer N (1 <= N <= 20,000),the number of congruence. The next N⑴ lines each contains two space-separated node numbers that are the endpoints of an edge in the tree. No edge will be listed twice,and all edges will be listed.

Output

For each test case,print a line containing two integers,the number of the node with minimum balance and the balance of that node.

Sample Input

1 7 2 6 1 2 1 4 4 5 3 7 3 1

Sample Output

1 2

#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<queue> #include<vector> using namespace std; #define ll long long #define N 21000 #define mem(a,t) memset(a,t,sizeof(a)) const int inf=1000005; int cnt,n; struct node { int v,next; }e[N*2]; int head[N]; int num[N]; int ans,index; void add(int u,int v) { e[cnt].v=v; e[cnt].next=head[u]; head[u]=cnt++; } void dfs(int u,int len,int fa) { int i,v,tmp=0; num[u]=1; for(i=head[u];i!=⑴;i=e[i].next) { v=e[i].v; if(v!=fa) { dfs(v,len+1,u); tmp=max(tmp,num[v]); num[u]+=num[v]; } } int t=max(tmp,n-num[u]); if(t<=ans) { if(u<index||t<ans) { ans=t; index=u; } } } int main() { //freopen("in.txt","r",stdin); int i,u,t; scanf("%d",&t); while(t--) { scanf("%d",&n); cnt=0; mem(head,⑴); for(i=1;i<n;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } mem(num,0); ans=n; dfs(1,⑴); printf("%d %d ",index,ans); } return 0; }






(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读