关于树的重心:百度百科

有关博客:http://blog.csdn.net/acdreamers/article/details/16905653

1.Balancing Act

To POJ.1655 Balancing Act

题目大意:

  有t组数据。每组数据给出n个点和n-1条边,构成一棵树,求该树的重心及删掉该点后形成的每棵子树的节点数。

代码:

 1 #include<cctype>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=20005;
 7 
 8 int n,cnt,H[N<<1],Ans,size,son[N];
 9 bool vis[N];
10 struct Edge
11 {
12     int to,nxt;
13 }e[N<<1];
14 
15 void read(int &now)
16 {
17     now=0;char c=getchar();
18     while(!isdigit(c))c=getchar();
19     while(isdigit(c))now=(now<<3)+(now<<1)+c-'0',c=getchar();
20 }
21 
22 void AddEdge(int u,int v)
23 {
24     e[++cnt].to = v;
25     e[cnt].nxt = H[u];
26     H[u] = cnt;
27 }
28 
29 void Init()
30 {
31     Ans=size=0x7fffffff;
32     for(int i=1;i<=n;++i)
33       vis[i]=son[i]=H[i]=0;
34     cnt=0;
35     read(n);
36     int a,b;
37     for(int i=1;i<n;++i)
38       read(a),read(b),AddEdge(a,b),AddEdge(b,a);
39 }
40 
41 void DFS(int cur)
42 {
43     vis[cur]=1;
44     son[cur]=0;
45     int tmp=0;
46     for(int i=H[cur];i;i=e[i].nxt)
47     {
48         int to=e[i].to;
49         if(!vis[to])
50         {
51             DFS(to);
52             son[cur]+=son[to]+1;
53             tmp=max(tmp,son[to]+1);
54         }
55     }
56     tmp=max(tmp,n-son[cur]-1);
57     if(size>tmp ||size==tmp&&Ans>cur)
58     {
59         Ans=cur;
60         size=tmp;
61     }
62 }
63 
64 int main()
65 {
66     int t;
67     read(t);
68     while(t--)
69     {
70         Init();
71         DFS(1);
72         printf("%d %d\n",Ans,size);
73     }
74     return 0;
75 }
Balancing Act

相关文章:

  • 2021-12-19
  • 2021-10-06
  • 2022-12-23
  • 2022-12-23
  • 2022-02-20
  • 2021-11-30
  • 2021-09-24
猜你喜欢
  • 2022-12-23
  • 2021-08-08
  • 2021-07-01
  • 2021-07-20
  • 2021-12-24
  • 2021-06-03
  • 2021-08-29
相关资源
相似解决方案