标签:tin ide enc end case let string 代码 更新
---恢复内容开始---
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14582 | Accepted: 6192 |
Description
Input
Output
Sample Input
1 7 2 6 1 2 1 4 4 5 3 7 3 1
Sample Output
1 2
题意大概就是给你一棵树,让你找树的重心。*树的重心:在一颗树中找到一个节点,这个节点的最大子树相对于其他节点的最大子树最小,该节点就是树的重心。删去重心,生成的一堆树尽可能平衡。
思路大概就是dfs遍历每一个点,然后找到该点的最大子树,不断更新拥有最小的最大子树的节点。
代码如下:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define maxn 20010 5 #define mmst(x,y) memset(x,y,sizeof(x)) 6 using namespace std; 7 int son[maxn],size,ans,T,n,ecnt,head[maxn]; 8 bool vis[maxn]; 9 struct edge 10 { 11 int u,v,next; 12 }E[maxn*2]; 13 void add(int u,int v) 14 { 15 E[ecnt++].u=u; 16 E[ecnt].v=v; 17 E[ecnt].next=head[u]; 18 head[u]=ecnt; 19 } 20 void dfs(int u) 21 { 22 vis[u]=1; 23 son[u]=0; 24 int tmp=0; 25 for(int i=head[u];i;i=E[i].next) 26 { 27 int v=E[i].v; 28 if(vis[v]) continue; 29 dfs(v); 30 son[u]+=son[v]+1; 31 tmp=max(tmp,son[v]+1); 32 } 33 tmp=max(tmp,n-son[u]-1); 34 if(tmp<size||tmp==size&&u<ans) 35 { 36 size=tmp; 37 ans=u; 38 } 39 } 40 void clr() 41 { 42 mmst(son,0); 43 mmst(head,0); 44 mmst(vis,0); 45 ecnt=0; 46 ans=size=0x3f3f3f3f; 47 } 48 int main() 49 { 50 scanf("%d",&T); 51 while(T--) 52 { 53 clr(); 54 scanf("%d",&n); 55 for(int i=1;i<n;++i) 56 { 57 int a,b; 58 scanf("%d%d",&a,&b); 59 add(a,b); 60 add(b,a); 61 } 62 dfs(1); 63 printf("%d %d\n",ans,size); 64 } 65 }
标签:tin ide enc end case let string 代码 更新
原文地址:http://www.cnblogs.com/mljkw-gsry/p/7607651.html