poj 1655 Balancing Act 求树的重心【树形dp】
题意:求树的重心且编号数最小
一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少。

(图片来源: PatrickZhou 感谢博主)
看上面的图就好明白了,不仅要考虑当前结点子树的大小,也要“向上”考虑树的大小。
那么其它就dfs完成就行了,son[] 存以前结点为根的结点个数。
这是用邻接表写:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = ;
const int INF = << ;
int head[maxn];
int son[maxn];
bool vis[maxn];
int n,siz, cnt, num;
struct Edge
{
int to, next;
};
Edge edge[maxn*]; void Init()
{
memset(vis, , sizeof(vis));
memset(head, -, sizeof(head));
siz =num= INF;
cnt = ;
} void add(int u, int v)
{
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
} void dfs(int u)
{
vis[u] = ;
son[u] = ;
int tmp = ;
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (!vis[v]) {
dfs(v);
son[u] += son[v];
tmp = max(tmp, son[v]);
}
}
tmp = max(tmp, n - son[u]);
if (tmp < siz || (tmp == siz&&u < num)) {
siz = tmp;
num = u;
}
} int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n;
Init();
for (int i = ; i < n; i++) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
dfs();
cout << num << " " << siz << endl;
}
return ;
}
这题用stl不超时:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = ;
const int INF = << ;
vector<int> tree[maxn];
int son[maxn];
int n, siz,num; void dfs(int u, int fa)
{
son[u] = ;
int tmp = ;
for (int i = ; i < tree[u].size(); i++) {
int v = tree[u][i];
if (v != fa) {
dfs(v,u);
son[u] += son[v];
tmp = max(tmp, son[v]);
}
}
tmp = max(tmp, n - son[u]);
if ((tmp < siz) || (tmp == siz&&u > num)) {
siz = tmp;
num = u;
}
} int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n;
for (int i = ; i <= n; i++) tree[i].clear();
for (int i = ; i < n; i++) {
int u, v;
cin >> u >> v;
tree[u].push_back(v);
tree[v].push_back(u);
}
num = , siz = INF;
dfs(, -);
cout << num << " " << siz << endl;
}
return ;
}
poj 1655 Balancing Act 求树的重心【树形dp】的更多相关文章
- POJ 1655 Balancing Act(求树的重心--树形DP)
题意:求树的重心的编号以及重心删除后得到的最大子树的节点个数size,假设size同样就选取编号最小的. 思路:随便选一个点把无根图转化成有根图.dfs一遍就可以dp出答案 //1348K 125MS ...
- POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)
<题目链接> 题目大意:给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析: ...
- POJ 1655 Balancing Act (树的重心,常规)
题意:求树的重心,若有多个重心,则输出编号较小者,及其子树中节点最多的数量. 思路: 树的重心:指的是一个点v,在删除点v后,其子树的节点数分别为:u1,u2....,设max(u)为其中的最大值,点 ...
- POJ 1655 BalanceAct 3107 Godfather (树的重心)(树形DP)
参考网址:http://blog.csdn.net/acdreamers/article/details/16905653 树的重心的定义: 树的重心也叫树的质心.找到一个点,其所有的子树中最大的 ...
- POJ 1655 Balancing Act【树的重心】
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14251 Accepted: 6027 De ...
- POJ 1655 Balancing Act【树的重心模板题】
传送门:http://poj.org/problem?id=1655 题意:有T组数据,求出每组数据所构成的树的重心,输出这个树的重心的编号,并且输出重心删除后得到的最大子树的节点个数,如果个数相同, ...
- POJ 1655 - Balancing Act - [DFS][树的重心]
链接:http://poj.org/problem?id=1655 Time Limit: 1000MS Memory Limit: 65536K Description Consider a tre ...
- POJ 1655 Balancing Act ( 树的重心板子题,链式前向星建图)
题意: 给你一个由n个节点n-1条边构成的一棵树,你需要输出树的重心是那个节点,以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的 题解: 树的重心定义:找到一个点,其所 ...
- POJ 1655 Balancing Act 焦点树
标题效果:鉴于一棵树.除去一个点之后,这棵树将成为一些中国联通的块.之后该点通过寻求取消最低形成块的最大数目. 思维:树DP思维.通过为每个子树尺寸的根节点深搜索确定.之后该节点然后除去,,还有剩下的 ...
随机推荐
- 关于Git回退再前进造成本地代码和远程仓库代码不一致的问题
事情经过: git push 提交之后(版本2.0), 回退, 然后做了一些修改, 发现有问题,于是脑抽回退git reset --hard HEAD^ (版本1,0), 然后又前进到之前那个版本( ...
- php静态变量问题
<?php$a=0; function test(){ static $a=0; $a+=1; echo $a; }test(); test(); ?>1.static是与销毁时间有关,与 ...
- HTTP协议①介绍
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基于TCP/IP通信 ...
- mysql 索引优化 性能调优 锁
1 检查mysql 是否安装 rpm -qa|grep -i mysql 2 ntsysv 查看和设置开机启动列表 3 mysql 在 centos 上默认 的数据目录是 /var/lib/mysql ...
- WPF 实现简单的跑马灯
本文用WPF的动画实现一个简单的跑马灯 xmal: <Window x:Class="wpfstatusBar.MainWindow" xmlns="http:// ...
- springmvc 传参Required String parameter 'xxxx' is not present
报错 请求因该是已经被分配了,但是参数补全,无法被执行 加上这个参数就好了,表示请求参数,可以为空 这样的好处是,可以进入controller之后再去判断,比较好定位错误
- 从默认的index.jsp页面跳转或转发到其他页面
使用forward还是redirect都可以完成跳转 forward:浏览器地址不变,所以存在重复提交的问题 <% pageContext.forward("student/list ...
- Axure之添加点击页面
添加悬停字体变色的效果 页面载入时的频道预设(我做错了,英文版本不知道那个是页面载入时的事件) 我的博客不够完善,看不到全部的图片.我后续会修改我的网站的
- yield函数的执行顺序
例子: 上图中标明了 行号出现的顺序 从顺序中可以看到 1.开始先执行for循环,执行到93行yield_test(1)时,会调用函数yield_test(),所以打印了79行内容 2.到80行时, ...
- 高效整洁CSS代码原则(上)
CSS学起来并不难,但在大型项目中,就变得难以管理,特别是不同的人在CSS书写风格上稍有不同,团队上就更加难以沟通,为此总结了一些如何实现高效整洁的CSS代码原则: 1. 使用Reset但并非全局Re ...