标签:main clear test mis idt created string using str
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12703 | Accepted: 5403 |
Description
Input
Output
Sample Input
1 7 2 6 1 2 1 4 4 5 3 7 3 1
Sample Output
1 2
题意:给你n个点,n-1条边形成一颗棵树,然后让你找树的重心;
思路:树形dp;
先dfs求出每个点所形成的子树的权值,然后再dfs求权值中的最大值更新dp。因为当前点的各个子树的权值都知道,那么只要求出当前节点父亲节点的权值,nod-sum[n];
复杂度O(n);
1 #include<stdio.h> 2 #include<math.h> 3 #include<queue> 4 #include<algorithm> 5 #include<string.h> 6 #include<iostream> 7 #include<stack> 8 #include<vector> 9 using namespace std; 10 typedef long long LL; 11 vector<int>vec[20005]; 12 int dp[20005]; 13 bool flag[20005]; 14 int sum[20005]; 15 void dfs(int n); 16 void dfs2(int n); 17 int nod; 18 int main(void) 19 { 20 int t; 21 scanf("%d",&t); 22 while(t--) 23 { 24 int n; 25 scanf("%d",&nod); 26 n = nod; 27 for(int i = 0;i < 20005;i++) 28 vec[i].clear(); 29 for(int i = 0; i < n-1; i++) 30 { 31 int a,b; 32 scanf("%d %d",&a,&b); 33 vec[a].push_back(b); 34 vec[b].push_back(a); 35 } 36 memset(flag,0,sizeof(flag)); 37 memset(dp,0,sizeof(dp)); 38 memset(sum,0,sizeof(sum)); 39 dfs(1); 40 memset(flag,0,sizeof(flag)); 41 dfs2(1); 42 int id = 0; 43 int maxx = 1e9; 44 for(int i = 1; i <= n; i++) 45 { 46 if(maxx > dp[i]) 47 maxx = dp[i],id = i; 48 } 49 printf("%d %d\n",id,maxx); 50 } 51 return 0; 52 } 53 void dfs(int n) 54 { 55 int i,j; 56 flag[n] = true; 57 for(i = 0; i < vec[n].size(); i++) 58 { 59 int id = vec[n][i]; 60 if(!flag[id]) 61 { 62 dfs(id); 63 sum[n]+=sum[id]; 64 } 65 } 66 sum[n]++; 67 } 68 void dfs2(int n) 69 { 70 flag[n] = true; 71 int i,j; 72 for(i = 0; i < vec[n].size(); i++) 73 { 74 int id = vec[n][i]; 75 if(!flag[id]) 76 { 77 dp[n] = max(dp[n],sum[id]); 78 dfs2(id); 79 } 80 } 81 dp[n] = max(dp[n],nod-sum[n]); 82 }
标签:main clear test mis idt created string using str
原文地址:http://www.cnblogs.com/zzuli2sjy/p/6238013.html