Balancing Act(poj1655)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 12703 | Accepted: 5403 |
Description
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
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 }
Balancing Act(poj1655)的更多相关文章
- 『Balancing Act 树的重心』
树的重心 我们先来认识一下树的重心. 树的重心也叫树的质心.找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 根据树的重心的定义,我们可 ...
- poj1655 Balancing Act 找树的重心
http://poj.org/problem? id=1655 Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- POJ1655 Balancing Act(树的重心)
题目链接 Balancing Act 就是求一棵树的重心,然后统计答案. #include <bits/stdc++.h> using namespace std; #define REP ...
- poj-1655 Balancing Act(树的重心+树形dp)
题目链接: Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11845 Accepted: 4 ...
- poj1655 Balancing Act (dp? dfs?)
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14247 Accepted: 6026 De ...
- POJ 1655 Balancing Act 树的重心
Balancing Act Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. ...
- POJ 1655 Balancing Act【树的重心】
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14251 Accepted: 6027 De ...
- POJ 1655.Balancing Act 树形dp 树的重心
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14550 Accepted: 6173 De ...
- POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)
关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...
随机推荐
- 17.Power of Four-Leetcode
#define IMIN numeric_limits<int>::min() #define IMAX numeric_limits<int>::max() class So ...
- 基于 Helm 快速部署 Wordpress
Helm 是 Kubernetes 中的一个开源软件包管理工具,Rainbond 从 5.3.1 版本开始支持部署 Helm 应用.实现 Helm 应用的便捷部署,访问控制.使 Rainbond 用户 ...
- abandon, abbreviation
abandon 近/反义词: continue, depart, desert (做动词时读作diˈzəːt), discard, give up, quit, surrender搭配: altoge ...
- 安全相关,关于https
什么是 HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全 ...
- css通配样式初始化(多款,供君自选)
腾讯官网 body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select{margin:0; ...
- 案例 stm32的dma传输过程
首先说一下:DMA_GetCurrDataCounter返回值是什么 返回值是dma缓存里还剩余多少空间. 上面本来应该是,发一下,改变一下.但是这里有一行是特殊的. long : 461,*ff l ...
- java打jar包和运行jar包的两种方式
java打jar包和运行jar包的两种方式更详细的打包方式请参考https://www.cnblogs.com/mq0036/p/8566427.html 一.java类不依赖第三方jar包以简单的一 ...
- 链式栈——Java实现
1 package struct; 2 3 //接口 4 interface ILinkStack{ 5 //栈中元素个数(栈大小) 6 int size(); 7 //取栈顶元素 8 Object ...
- java通过JDBC访问数据库(最基本的查询)
一.步骤介绍 1.通过Class.forName()加载驱动: 2.通过DriverManager.getConnection()获取Conncetion连接对象: 3.创建Statement对象传递 ...
- SVM中的软间隔最大化与硬间隔最大化
参考文献:https://blog.csdn.net/Dominic_S/article/details/83002153 1.硬间隔最大化 对于以上的KKT条件可以看出,对于任意的训练样本总有ai= ...