BZOJ1131: [POI2008]Sta

题意:给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大。

题解:记录每个点的深度,再根据根节点的深度和逐层推导出其他点的深度和。

我用的是BFS

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
int n,cnt,ans;
int head[],next[],to[],fa[],s[];
ll f[],g[],siz[];
queue<int> q;
void add(int a,int b)
{
to[cnt]=b;
next[cnt]=head[a];
head[a]=cnt++;
}
int main()
{
scanf("%d",&n);
memset(head,-,sizeof(head));
int i,a,b,u;
for(i=;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
q.push();
while(!q.empty())
{
u=q.front();
q.pop();
s[++s[]]=u;
siz[u]++;
for(i=head[u];i!=-;i=next[i])
{
if(to[i]!=fa[u])
{
fa[to[i]]=u;
q.push(to[i]);
}
}
}
for(i=n;i>=;i--)
{
siz[fa[s[i]]]+=siz[s[i]];
f[fa[s[i]]]+=siz[s[i]]+f[s[i]]; //f[i]表示i的所有儿子到i的深度之和
}
g[]=f[ans=];
for(i=;i<=n;i++)
{
g[s[i]]=g[fa[s[i]]]+n-(siz[s[i]]<<); //g[i]表示所有点到i的距离之和,可由g[fa[i]]推出
if(g[ans]<g[s[i]]||(g[ans]==g[s[i]]&&ans>s[i]))
ans=s[i];
}
printf("%d",ans);
return ;
}

POJ3107:Godfather

题意:在树中找一个点,使去掉这个点后,剩余的所有子树节点个数的最大值最小,求满足要求的所有节点。

题解:求出每个子树的节点个数size[x],则答案为min(size[y],n-size[x]),y是x的儿子。

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int maxn=;
int n,cnt,minn;
int head[maxn],to[maxn<<],next[maxn<<],s[maxn],f[maxn],sta[maxn];
int readin()
{
int ret=; char gc;
while(gc<''||gc>'') gc=getchar();
while(gc>=''&&gc<='') ret=ret*+gc-'',gc=getchar();
return ret;
}
void add(int a,int b)
{
to[cnt]=b;
next[cnt]=head[a];
head[a]=cnt++;
}
void dfs(int x,int fa)
{
s[x]=;
for(int i=head[x];i!=-;i=next[i])
{
if(to[i]!=fa)
{
dfs(to[i],x);
s[x]+=s[to[i]];
f[x]=max(f[x],s[to[i]]);
}
}
f[x]=max(f[x],n-s[x]);
minn=min(minn,f[x]);
}
int main()
{
n=readin();
memset(head,-,sizeof(head));
int i,a,b;
for(i=;i<n;i++)
{
a=readin(),b=readin();
add(a,b),add(b,a);
}
minn=<<;
dfs(,);
for(i=;i<=n;i++) if(f[i]==minn) sta[++sta[]]=i;
for(i=;i<sta[];i++) printf("%d ",sta[i]);
printf("%d",sta[sta[]]);
return ;
}

POJ1655:Balancing Act

题意:同POJ3107

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
const int maxn=;
int n,minn,ans,cnt;
int s[maxn],to[maxn<<],next[maxn<<],head[maxn];
int readin()
{
int ret=; char gc;
while(gc<''||gc>'') gc=getchar();
while(gc>=''&&gc<='') ret=ret*+gc-'',gc=getchar();
return ret;
}
void add(int a,int b)
{
to[cnt]=b;
next[cnt]=head[a];
head[a]=cnt++;
}
void dfs(int x,int fa)
{
int t=;
s[x]=;
for(int i=head[x];i!=-;i=next[i])
{
if(to[i]!=fa)
{
dfs(to[i],x);
s[x]+=s[to[i]];
t=max(t,s[to[i]]);
}
}
t=max(t,n-s[x]);
if(t<minn||(t==minn&&x<ans)) ans=x,minn=t;
}
void work()
{
n=readin();
memset(head,-,sizeof(head));
ans=cnt=,minn=<<;
int i,a,b;
for(i=;i<n;i++)
{
a=readin(),b=readin();
add(a,b),add(b,a);
}
dfs(,);
printf("%d %d\n",ans,minn);
}
int main()
{
int t=readin();
while(t--) work();
return ;
}

BZOJ1827:[Usaco2010 Mar]gather 奶牛大集会

题意:与上一题差不多,只不过不同的点有不同的牛居住,求的是所有牛到核心的最小总路程

题解:见http://www.cnblogs.com/CQzhangyu/p/6178852.html

树形DP水题杂记的更多相关文章

  1. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  2. 树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]

    题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 ...

  3. ACM :漫漫上学路 -DP -水题

    CSU 1772 漫漫上学路 Time Limit: 1000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  4. [poj2247] Humble Numbers (DP水题)

    DP 水题 Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The se ...

  5. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  6. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  7. Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题

    除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...

  8. 51nod 1353 树 | 树形DP经典题!

    51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...

  9. P2016 战略游戏——树形DP大水题

    P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...

随机推荐

  1. myeclipse相关

    :) MyEclipse 10.7以后开始支持JDK1.7,修改settings下面的配置文件没卵用.

  2. Android之WebView学习

    WebView常用方法 WebSettings 在使用WebView前我们都要进行相关的配置,常见的操作如下: WebSettings settings = mWebView.getSettings( ...

  3. 20145206邹京儒《Java程序设计》第2周学习总结

    20145206 <Java程序设计>第2周学习总结 教材学习内容总结 一.类型 Java可区分为基本类型和类类型两大类型系统,其中,类类型也称为参考类型. 在Java中的基本类型主要可区 ...

  4. mysql编码设置

    一:mysql字符集 mysql的字符集支持(Character Set Support)有两个类型:字符集(Character set)和连接校对(Collation).对于字符集的支持细化到四个层 ...

  5. Android的两种事件处理机制

    UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...

  6. 7z命令行工具

    7z (中文)是优秀开源的压缩解压缩软件(wiki: en  中文),有windows版本与linux版本,最新的9.32版本支持的格式包括: 压缩与解压缩均支持:7z, XZ, BZIP2, GZI ...

  7. 算法系列:Reservoir Sampling

    copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  8. POJ1285 Combinations, Once Again(背包 排列组合)

    背包解组合数学问题,n种物品,每种num[i]个,求取r个的方法数. 背包思想,f[j]表示当前取j个数的方法数,则状态转移方程为 f[j] += f[k](max(j - num[i], 0) &l ...

  9. 初探数位DP-hdu2089

    一开始刷dp就遇到了数位dp,以前程序设计艺术上看过一点,基本没懂,于是趁今天遇到题目,想把它搞会,但就目前状态来看仍然是似懂非懂啊,以后还要反复搞 统计区间[l,r]的满足题意的数的个数,可以转换成 ...

  10. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...