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求树的重心的更多相关文章

  1. 树形DP求树的重心 --SGU 134

    令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...

  2. POJ 1655 Balancing Act (树形DP求树的重心)

    题意: 求一棵树中以某个点为重心最小的子树集, 就是去掉这个点, 图中节点最多的联通块节点最少. 分析: 想知道这个点是不是最优的点, 只要比较它子树的数量和除去这部分其他的数量(它的父节点那部分树) ...

  3. HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  4. 浅谈关于树形dp求树的直径问题

    在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...

  5. poj1655(dfs,树形dp,树的重心)

    这是找树的重心的经典题目. 树的重心有下面几条常见性质: 定义1:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心.定义2:以这个点为根,那么所有的子树(不算整个树自身)的大 ...

  6. 树形dp - 求树的直径

    随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...

  7. 树形DP求树的最小支配集,最小点覆盖,最大独立集

    一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...

  8. tree_cuttting(树形dp求解树的重心)

    Tree Cutting After Farmer John realized that Bessie had installed a "tree-shaped" network ...

  9. DP求树的重心

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

随机推荐

  1. jquery $.trim()方法使用介绍

    $.trim(str)的作用是去掉字符串首尾空格 $.trim(str) 返回:string: 说明:去掉字符串首尾空格. 示例: 先看个错误代码: <input type="text ...

  2. MySQL 备份和恢复

      详细地址:http://imysql.cn/mysql_backup_and_recover

  3. DataGrid3

    a标签,DataGrid的数据绑定 1.function aa(id, url) {            //alert(id);            window.open(url + '&am ...

  4. 数列平方根的和 java

    题目描述: 数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. 输入 输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和 ...

  5. Android BroadcasetReceiver

    ci@clinux:~/mp_mtk$ adb -s QGAEFYAAOFN7PNOB logcat PhoneReceiver:e *:S --------- beginning of system ...

  6. yum最常用的命令

    yum是一个用于管理rpm包的后台程序,用python写成,可以非常方便的解决rpm的依赖关系.在建立好yum服务器后,yum客户端可以通过 http.ftp方式获得软件包,并使用方便的命令直接管理. ...

  7. this.IsMounted() is not a function

    I'm trying to build a simple React App. It retrieves data from an ajax call and renders it to the pa ...

  8. ASP.NET MVC4学习笔记之总体概述

    断断续续使用ASP.NET MVC框架也有一年多了,也算积累了一些经验,唉,一直想写一些笔记好好总结一下,人太懒不想动笔,今天终于决定开始.希望自己能坚持下去. 这篇文章大体介绍ASP.NET MVC ...

  9. python之递归

    递归的定义:即对自己自身内容的引用. 有用的递归函数应包含以下几步份: 当函数直接返回值时有基本的实例(最小可能性问题): 递归实例,包括一个或者多个问题较小部分的递归调用: 递归的关键就是将问题分解 ...

  10. LAMP开发之环境搭建(2014.12.7在ubuntu下)

    Ubuntu下搭建LAMP环境 前言:学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我搭建的是LAMP环境,即Linux.Apache ...