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. [SQL]SUTFF内置函数的用法 (删除指定长度的字符并在指定的起始点插入另一组字符)

    STUFF 删除指定长度的字符并在指定的起始点插入另一组字符. 语法 STUFF ( character_expression , start , length , character_express ...

  2. 几款jQuery右键菜单插件

    1.jQuery Very Simple ContextMenu Plugin 2.ContextJS Project Page:http://lab.jakiestfu.com/contextjs/ ...

  3. ie、IE兼容模式,提示SCRIPT1028: 缺少标识符、字符串或数字

    旧版ie下json最后一项是不允许有逗号的 为了更好的兼容各个浏览器,json最后的逗号最好不加

  4. SQL学习备忘

    1.按照拼音首字母的正序或倒序排序 SELECT CREATOR_REALNAME FROM tableName ORDER BY NLSSORT(CREATOR_REALNAME, 'NLS_SOR ...

  5. 字符集转换: Unicode - Ansi

    字符集转换: Unicode - Ansi string UnicodeToAnsi ( const wstring& wstrSrc ) { /*!< 分配目标空间, 一个16位Uni ...

  6. (转)Linux性能调优之虚拟内存篇

    简单地说,虚拟内存就是硬盘中的一块区域,它用来存放内存里使用频率不高的页面文件.好处是为了提高内存的利用率 - 让使用频率高的页面文件活动在内存区域中,提高CPU对数据操作的速度.在Linux中,这个 ...

  7. 内核 current宏解析

    Technorati 标签: current thread_info      在内核中,可以通过current宏来获得当前执行进程的task_struct指针.现在来简要分析以下:      最原始 ...

  8. MYSQL IN 与 EXISTS 的优化示例

    文章转载自:http://www.jb51.net/article/53127.htm 当B表的数据集必须小于A表的数据集时,用in优于exists,当A表的数据集系小于B表的数据集时,用exists ...

  9. Linux mkisofs 创建光盘镜像文件(Linux指令学习笔记)

    mkisofs命令 创建光盘文件的系统的命令是mkisofs.光盘系统有多种格式,利用Linux系统提供的光盘文件系统创建 命令mkisofs,可以创建多种iso9660文件系统. 我们一般不用mki ...

  10. jquery easyui combox实用方法记录

    // combogrid刷新 $(“#cc").combogrid('grid').datagrid('load'); // combogrid设置默认选中哪一行 $('#cc').comb ...