树形dp求树的重心
Balancing Act http://poj.org/problem?id=1655
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
vector<int> g[M];
int dp[M],num[M],n;
void dfs(int u,int fa){
dp[u]=;
num[u]=;
int len=g[u].size();
for(int i=;i<len;i++){
int v=g[u][i];
if(v!=fa){
dfs(v,u);
num[u]+=num[v];
dp[u]=max(dp[u],num[v]);
}
}
dp[u]=max(dp[u],n-num[u]);
}
int main(){
int t;
while(~scanf("%d",&t)){
while(t--){
scanf("%d",&n);
for(int i=;i<=n;i++) g[i].clear();
for(int i=,u,v;i<n-;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(,-);
int sma=n;
for(int i=;i<=n;i++){
sma=min(sma,dp[i]);
}
for(int i=;i<=n;i++){
if(dp[i]==sma){
printf("%d %d\n",i,dp[i]);
break;
}
}
}
}
return ;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
struct G{
struct E{
int u,v,next;
}e[M<<];
int le,head[M];
void init(){
le=;
mt(head,-);
}
void add(int u,int v){
e[le].u=u;
e[le].v=v;
e[le].next=head[u];
head[u]=le++;
}
}g;
int dp[M],num[M],n;
void dfs(int u,int fa){
dp[u]=;
num[u]=;
for(int i=g.head[u];~i;i=g.e[i].next){
int v=g.e[i].v;
if(v!=fa){
dfs(v,u);
num[u]+=num[v];
dp[u]=max(dp[u],num[v]);
}
}
dp[u]=max(dp[u],n-num[u]);
}
int main(){
int t;
while(~scanf("%d",&t)){
while(t--){
scanf("%d",&n);
g.init();
for(int i=,u,v;i<n-;i++){
scanf("%d%d",&u,&v);
g.add(u,v);
g.add(v,u);
}
dfs(,-);
int sma=n;
for(int i=;i<=n;i++){
sma=min(sma,dp[i]);
}
for(int i=;i<=n;i++){
if(dp[i]==sma){
printf("%d %d\n",i,dp[i]);
break;
}
}
}
}
return ;
}
Godfather http://poj.org/problem?id=3107
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
struct G{
struct E{
int u,v,next;
}e[M<<];
int le,head[M];
void init(){
le=;
mt(head,-);
}
void add(int u,int v){
e[le].u=u;
e[le].v=v;
e[le].next=head[u];
head[u]=le++;
}
}g;
int dp[M],num[M],n;
void dfs(int u,int fa){
dp[u]=;
num[u]=;
for(int i=g.head[u];~i;i=g.e[i].next){
int v=g.e[i].v;
if(v!=fa){
dfs(v,u);
num[u]+=num[v];
dp[u]=max(dp[u],num[v]);
}
}
dp[u]=max(dp[u],n-num[u]);
}
int main(){
while(~scanf("%d",&n)){
g.init();
for(int i=,u,v;i<n-;i++){
scanf("%d%d",&u,&v);
g.add(u,v);
g.add(v,u);
}
dfs(,-);
int sma=n;
for(int i=;i<=n;i++){
sma=min(sma,dp[i]);
}
for(int i=;i<=n;i++){
if(dp[i]==sma){
printf("%d ",i);
}
}
puts("");
}
return ;
}
end
树形dp求树的重心的更多相关文章
- 树形DP求树的重心 --SGU 134
令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...
- POJ 1655 Balancing Act (树形DP求树的重心)
题意: 求一棵树中以某个点为重心最小的子树集, 就是去掉这个点, 图中节点最多的联通块节点最少. 分析: 想知道这个点是不是最优的点, 只要比较它子树的数量和除去这部分其他的数量(它的父节点那部分树) ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 浅谈关于树形dp求树的直径问题
在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...
- poj1655(dfs,树形dp,树的重心)
这是找树的重心的经典题目. 树的重心有下面几条常见性质: 定义1:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心.定义2:以这个点为根,那么所有的子树(不算整个树自身)的大 ...
- 树形dp - 求树的直径
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...
- tree_cuttting(树形dp求解树的重心)
Tree Cutting After Farmer John realized that Bessie had installed a "tree-shaped" network ...
- DP求树的重心
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
随机推荐
- lua中pairs和ipairs的区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中 ...
- Angularjs入门学习一 简介
本系列文章是从头开始学习angularjs,下文中用ng表示angularjs,要知道从以为根深蒂固的jquery开发者转变开发思想,确实需要一段时间,下面介绍以下 angularjs,我也是参考网上 ...
- java使用sigar 遇到问题的解决方案
先给大家介绍一个开源工具Sigar 官网:http://sigar.hyperic.com/ API:http://www.hyperic.com/support/docs/sigar/index-a ...
- C++ 重载new和delete操作符
原因: C++标准库提供的new和delete操作符,是一个通用实现,未针对具体对象做具体分析 存在分配器速度慢.小型对象空间浪费严重等问题,不适用于对效率和内存有限制的应用场景 好处: 灵活的内 ...
- .NET中的 枚举
我理解的枚举就是编程中约定的一个"可选值":例如QQ的在线状态,分别有 在线,Q我吧,隐身,忙碌等等...我觉得这就是一个枚举. 1.普通枚举 1) 实例 public en ...
- 《samba搭建win客户端和linux客户端的区别》
samba服务的搭建 客户的使用系统的不同也导致测试结果的不同. linux系统客户端: security = user or share smbclient -L //192.168.7.113/w ...
- ROS ZYNQ移植
1 准备工作 全部是按照官方操作的:http://wiki.ros.org/groovy/Installation/Source apt-get install python-rosdep py ...
- hbase meta表的结构
下面看下hbase:meta 表的结构,hbase:meta表中,保存了每个表的region地址,还有一些其他信息,例如region的名字,HRegionInfo,服务器的信息.hbase:meta表 ...
- 分享:Perl打开与读取文件的方法
在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作. Perl打开与读取文件的方法,供大家学习参考.本文转自: ...
- jquery弹出关闭遮罩层实例
jquery弹出关闭遮罩层实例. 代码如下: <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" & ...