POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
树的重心的定义是: 一个点的所有子树中节点数最大的子树节点数最小。
这句话可能说起来比较绕,但是其实想想他的字面意思也就是找到最平衡的那个点。
题目大意: 直接给你一棵树,让你求树的重心,如果有多个,找出编号最小的那个,并输出他的子树当中最大的节点数。
思路:利用dfs求出每个点的所有孩子数目,然后在dfs一下求出树的重心。
用途:树的重心在树分治的点分治中有重要作用。具体可以看上篇树分治的题目http://www.cnblogs.com/Howe-Young/p/4776852.html
代码:
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = ;
const int inf = 0x3f3f3f3f;
int tot, head[maxn];
struct Edge {
int to, next;
}edge[maxn];
int siz[maxn];
void init()
{
tot = ;
memset(head, -, sizeof(head));
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
int dfs_size(int u, int fa)
{
siz[u] = ;
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (v == fa) continue;
siz[u] += dfs_size(v, u);
}
return siz[u];
}
int minn;
void dfs_balance(int u, int fa, int totnum, int &root)
{
int maxx = totnum - siz[u];
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (v == fa) continue;
dfs_balance(v, u, totnum, root);
maxx = max(maxx, siz[v]);
}
if (maxx < minn || maxx == minn && root > u)
{
minn = maxx;
root = u;
}
}
void solve()
{
int totnum = dfs_size(, );
minn = inf;
int root;
dfs_balance(, , totnum, root);
printf("%d %d\n", root, minn);
}
int main()
{
int T, n;
scanf("%d", &T);
while (T--)
{
init();
scanf("%d", &n);
int u, v;
for (int i = ; i < n; i++)
{
scanf("%d %d", &u, &v);
addedge(u, v);
addedge(v, u);
}
solve();
}
return ;
}
POJ 3107
题目大意: 还是给出一棵树,让求它的所有的重心。
思路:基本上和上一个题目一样,就是多了所有的重心。在求所有的重心的时候如果找到了最小的比之前的都小,那么现在就它一个,如果相等的话,就继续往上加,因为还没找到比他还小的
代码:
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = ;
const int inf = 0x3f3f3f3f;
int tot, head[maxn];
struct Edge {
int to, next;
}edge[maxn];
int siz[maxn];
int res[maxn], index;
void init()
{
tot = ;
memset(head, -, sizeof(head));
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
int dfs_size(int u, int fa)
{
siz[u] = ;
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (v == fa) continue;
siz[u] += dfs_size(v, u);
}
return siz[u];
}
int minn;
void dfs_balance(int u, int fa, int totnum)
{
int maxx = totnum - siz[u];
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (v == fa) continue;
dfs_balance(v, u, totnum);
maxx = max(maxx, siz[v]);
}
if (maxx < minn)
{
minn = maxx;
index = ;
res[index++] = u;
}
else if (maxx == minn)
{
res[index++] = u;
}
}
void solve()
{
int totnum = dfs_size(, );
minn = inf;
dfs_balance(, , totnum);
sort(res, res + index);
for (int i = ; i < index; i++)
printf("%d ", res[i]);
puts("");
}
int main()
{
int n;
while (~scanf("%d", &n))
{
init();
int u, v;
for (int i = ; i < n; i++)
{
scanf("%d %d", &u, &v);
addedge(u, v);
addedge(v, u);
}
solve();
}
return ;
}
POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)的更多相关文章
- POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)
关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...
- POJ 1655 Balancing Act && POJ 3107 Godfather
题目大意: 根据题目的图很好理解意思,就是记录每一个点的balance,例如 i 的balance就是把 i 从这棵树中除去后得到的森林中含有结点数最多 的子树中的节点个数,然后找到所有节点中对应的b ...
- poj 1655 Balancing Act 求树的重心【树形dp】
poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...
- poj 1655 Balancing Act(找树的重心)
Balancing Act POJ - 1655 题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的. /* 找树的重心可以用树形dp或 ...
- 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 BalanceAct 3107 Godfather (树的重心)(树形DP)
参考网址:http://blog.csdn.net/acdreamers/article/details/16905653 树的重心的定义: 树的重心也叫树的质心.找到一个点,其所有的子树中最大的 ...
- POJ 1655 - Balancing Act 树型DP
这题和POJ 3107 - Godfather异曲同工...http://blog.csdn.net/kk303/article/details/9387251 Program: #include&l ...
- POJ 1655 - Balancing Act - [DFS][树的重心]
链接:http://poj.org/problem?id=1655 Time Limit: 1000MS Memory Limit: 65536K Description Consider a tre ...
随机推荐
- php把文件上传到远程服务器上例子
在这里我们利用curl实现把本地服务器的文件通过curl发送请求给远程服务器的php文件接受就实现了上传,还一个是利用ftp来上传方法也是php中的curl操作ftp服务器进行上传. 我这里写的是用c ...
- DEDECMS 关键字不能小于2个字节!
今天在做DEDECMS模板时,突然遇到了“关键字不能小于2个字节!”晕,是怎么回事呢?百度了一下,找到了答案,把他记录下来,方便自己日后再遇到这种问题时,可以查询: <form name=&qu ...
- PHP学习之中数组-遍历一维数组【2】
在PHP学习之中数组[1]中学会怎么创建一个数组,如果PHP学习之中数组[1]中的元素多的话,我们访问元素又是一个问题了,下面我们就使用for语句while,foreach来遍历我们的数组: < ...
- block 数组排序
#import <Foundation/Foundation.h> //定义⼀一个block,返回值为BOOL,有两个NSString参数.实现:判 //断字符串是否相等. BOOL (^ ...
- 转:100个高质量Java开发者博客
原文来自于:http://www.importnew.com/7469.html ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博客,然后不段补充到这个列表.欢 ...
- Web工程软件升级之数据库升级(二)
升级前检查 1. 用户是否存在 awk -F: '{if($1 == "xxx") print $1}' /ect/passwd 用户名 awk -F: '{if($1 == &q ...
- 汇编cmp比较指令详解
刚刚看到了cmp指令,一开始有点晕.后来上网找了些资料,终于看明白了,为了方便初学者,我就简单写下我的思路吧.高手绕过,谢谢! cmp(compare)指令进行比较两个操作数的大小 例:cmp opr ...
- js中的Call与apply方法
看到同行写得不错,直接转载了...0.0 祝大家天天开心! 例子来源http://uule.iteye.com/blog/1158829
- 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 题目大意: N个点M条无向边(N,M<=105),每条边属于某一条地铁Ci ...
- 【动态规划】【二分】【最长上升子序列】HDU 5773 The All-purpose Zero
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 题目大意: T组数据,n个数(n<=100000),求最长上升子序列长度(0可以替代任何 ...