题意:给你一颗树,让你求树的重心,树的重新的定义是如果去除掉这个节点,这个节点的子树节点个数的最大值 最小。
解题思路:
动态规划,树形dp
在这里发现 vector 还是比 数组指针性能上差一些。
解题代码:
1 // File Name: poj1741.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月05日 星期日 08时06分24秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 20010 26 using namespace std; 27 int ans; 28 int ansv; 29 int mx[maxn]; 30 int sum[maxn]; 31 int visit[maxn]; 32 vector<int> mp[maxn]; 33 void dfs(int k) 34 { 35 //printf("%d\n",k); 36 int num = mp[k].size(); 37 sum[k] = 1; 38 for(int i = 0; i < num;i ++ ) 39 { 40 if(!visit[mp[k][i]]) 41 { 42 visit[mp[k][i]] = 1; 43 dfs(mp[k][i]); 44 mx[k] = max(sum[mp[k][i]],mx[k]); 45 sum[k] += sum[mp[k][i]]; 46 } 47 } 48 } 49 int main(){ 50 int t; 51 scanf("%d",&t); 52 while(t--) 53 { 54 int n ; 55 scanf("%d",&n); 56 int u, v; 57 for(int i = 1;i <= n;i ++) 58 mp[i].clear(); 59 for(int i = 1;i < n;i ++ ) 60 { 61 scanf("%d %d",&u,&v); 62 mp[u].push_back(v); 63 mp[v].push_back(u); 64 } 65 memset(mx,0,sizeof(int)*(n+1)); 66 memset(visit,0,sizeof(int)*(n+1)); 67 visit[1] = 1; 68 dfs(1); 69 ansv = 1e9; 70 for(int i = 1;i <= n;i ++) 71 { 72 int tmx = max(sum[1] - sum[i],mx[i]); 73 if(tmx < ansv) 74 { 75 ans = i; 76 ansv = tmx; 77 } 78 } 79 printf("%d %d\n",ans,ansv); 80 } 81 return 0; 82 }
没有梦想,何谈远方