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思维.通过为每个子树尺寸的根节点深搜索确定.之后该节点然后除去,,还有剩下的 ...
随机推荐
- CentOS + Nginx 的常用操作指令总结
CentOS + Nginx 的常用操作指令总结 一. 关于CentOS 查看 yum 源是否存在 yum list | grep nginx 如果不存在 或者 不是自己想要的版本 可以自己设置Ngi ...
- GIL(全局解释器锁) 理解
GIL 锁,全局解释器锁,作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行. 线程非独立的,所以同一进程里线程是数据共享,当各个线程访问数据资源时会出现竞状态,即数据可能会同时被多个 ...
- @ font-face 引入本地字体文件
@font-face { font-family: DeliciousRoman; src: url('…/Delicious-Roman.otf'); font-stretch: condensed ...
- Git.之.最小化配置
Git.之.最小化配置 做一个全局的用户配置,便于以后提交代码等,记录当前操作的用户. ## 添加配置 # git config [--local | --global | --system] use ...
- vue 使用 element ui动态添加表单
html部分 <div class="hello"> <el-form :model="dynamicValidateForm" ref=&q ...
- Leetcode657.Robot Return to Origin机器人能否返回原点
在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串表示.字符 move[i] 表示其第 i 次移动.机器 ...
- golang之结构体
Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型. Go 语言中的类型可以被实例化,使用new或&a ...
- Spring 社区的首个国产开源项目顺利毕业
相信大家对上周的 <来自 Spring Cloud 官方的消息,Spring Cloud Alibaba 即将毕业>文章记忆犹新.本周,Spring Cloud Alibaba 正式毕业, ...
- CISC和RISC是什么?它们的特点和区别?
CISC的英文全称为“Complex Instruction Set Computer”,即“复杂指令系统计算机”,从计算机诞生以来,人们一直沿用CISC指令集方式.早期的桌面软件是按CISC设计的, ...
- 机器学习之决策树(ID3)算法与Python实现
机器学习之决策树(ID3)算法与Python实现 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...