SGU 134.Centroid(图心)
时间限制:0.25s
空间限制:4M
题意:
给出一个树(节点数<=16000),一个节点的重量定义为从树中去除这个点后,新得到的所有树中节点最多的树的节点数。树的中心定义为所有节点重量最小的那几个。
要求输出给定树的树的中心的重量,以及所有的树心的编号。
Solution:
首先,以任意节点为根,构造一颗具有父子节点关系的树。
使用递归即可,Fa[i]记录i的父亲节点编号。
sum[i],记录i节点以其所有儿子节点一共有多少个节点。
显然如果以1号节点为根 sum[1]=n;
再来考虑如何得到一个节点的重量。
对于根节点,它的重量是 所有 儿子节点sum[j]中的最大值。
对于根节点的儿子k呢?
它的重量是他的 所有儿子节点的sum[]和 (sum[1]-sum[k])的最大值。
那么对于k的儿子呢?
这时可以注意到计算k 的时候与根节点其他儿子已经没有关系了,需要的只是sum[i],
在计算k儿子时,把k当做根,这时sum[k]=n;
设p为k的儿子,
p的重量就是 它所有儿子的sum[]和 (sum[k]-sum[p])的最大值.
最后只要存下不同重量的节点有哪一些输出就可以了。
参考代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
#define INF 16666
using namespace std;
struct node {
int v, ne;
} edge[INF<<2];
queue<int> ql;
int head[INF], fa[INF], pd[INF];
int sum[INF], cnt, nCnt[INF];
vector<int> out[INF];
int n, m, ans = INF;
void added (int u, int v) {
edge[++cnt].v = v;
edge[cnt].ne = head[u];head[u] = cnt;
}
int Count (int x) {
pd[x] = sum[x] = 1;
for (int i = head[x]; i != 0; i = edge[i].ne) {
int j = edge[i].v;
if (!pd[j]) {
fa[j] = x;
sum[x] += Count (j);
}
}
return sum[x];
}
void make (int x) {
int k=0;
if (fa[x] != 0) k = sum[fa[x]] - sum[x];
for (int i = head[x]; i != 0; i = edge[i].ne) {
int j = edge[i].v;
if (j != fa[x]){
k = max (k, sum[j]);
if(fa[x]!=0) sum[x]=sum[fa[x]];
make(j);
}
}
if (ans >= k) {
ans = k;
out[k].push_back (x);
nCnt[k]++;
}
}
int main() {
int x, y, c;
scanf ("%d", &n);
for (int i = 1; i <= n - 1; i++) {
scanf ("%d %d", &x, &y);
added (x, y), added (y, x);
}
Count (1);
make (1);
printf ("%d %d\n", ans, nCnt[ans]);
sort (out[ans].begin(), out[ans].end() );
for (int i = 0; i <= out[ans].size() - 1; i++)
printf ("%d ", out[ans][i]);
return 0;
}
SGU 134.Centroid(图心)的更多相关文章
- SGU 134.Centroid( 树形dp )
一道入门树dp, 求一棵树的重心...我是有多无聊去写这种题...傻X题写了也没啥卵用以后还是少写好.. ----------------------------------------------- ...
- SGU 134 Centroid
题意:给出一个树,每个点有一个value,value的意义是去掉这个点之后所有连通分量中点最多的那个连通分量的点数,这棵树的重心为所有点value的最小值,求重心,及重心都有谁. 解法:貌似是个树形d ...
- 树形DP求树的重心 --SGU 134
令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...
- Centroid - SGU 134(树的搜索)
题目大意:给你一个树,树每个点都有一个值, 这个点的的值就等于所有儿子里面点最多的那个儿子,值最小的就叫做重心,求出重心,还有所有等于重心的点,按照升序输出. 分析:就是一个简单的搜索树,求出来最大的 ...
- SGU Volume 1
SGU 解题报告(持续更新中...Ctrl+A可看题目类型): SGU101.Domino(多米诺骨牌)------------★★★type:图 SGU102.Coprimes(互质的数) SGU1 ...
- SGU 乱乱开
本解题报告 乱抄,乱写,随性随心,不喜多喷! SGU 142: 思路:一个string的字串不会超过2^20个,我们枚举出来就好了. 我出错点:数组RE #include<stdio.h> ...
- SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...
- 快速切题 sgu134.Centroid 树形dp
134. Centroid time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given an undirec ...
- SGU 乱搞日志
SGU 100 A+B :太神不会 SGU 101 Domino: 题目大意:有N张骨牌,两张骨牌有两面有0到6的数字,能相连当且仅当前后数字相同,问能否有将N张骨牌连接的方案?思路:裸的欧拉回路,注 ...
随机推荐
- nginx -- nginx平台初探(100%)
初探nginx架构(100%) 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧. nginx在启动后,在un ...
- Research Papers
NSE, $\bbu$ [Papers]NSE, $u$, Lorentz space [Sohr, JEE, 2001] [Papers]NSE, $u$, Lorentz space [Bjorl ...
- Hadoop yarn配置参数
参照site:http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml 我们在配置yar ...
- A Round Peg in a Ground Hole - POJ 1584 (判断凸多边形&判断点在多边形内&判断圆在多边形内)
题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内. 分析:判断凸多边形可 ...
- Hibernate自定查询返回list<?>
/** * * @param session * :一个会话 * * @param hql * :是需要执行的hql语句, * * @param offset * 设置开始位置 * * @param ...
- Away3D 的实体收集器流程2
带着上次的疑问我们继续探讨Away3D 的渲染流程. 在Away3D中所有的显示对象都是继承Object3D 的我们先看看显示对象和继承关系. Object3D |---ObjectContainer ...
- javascript中的稀疏数组(sparse array)和密集数组
学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...
- SystemTap----常用变量、宏、函数和技巧
http://blog.csdn.net/moonvs2010/article/category/1570309
- Linux堆内存管理深入分析--阿里聚安全
http://www.freebuf.com/author/%E9%98%BF%E9%87%8C%E8%81%9A%E5%AE%89%E5%85%A8
- Dreamweaver cs6安装破解
Dreamweaver 是前端开发的必备软件.目前最新版本为CS6,与CS5相比多了对HTML5.CSS3.jquery的关联支持,可以更方便的在Dreamweaver中编写前端代码. 安装准备: 1 ...