树形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> ...
随机推荐
- jquery设置元素readonly和disabled(checkbox只读)
jquery api中提供了对元素应用disabled和readonly属性的方法:1,readonly 代码示例: $('input').attr("readonly",&quo ...
- iOS Core Animation Advanced Techniques
Book Descripter Core Animation is the technology underlying Apple's iOS user interface. By unleashin ...
- Floyd最短路径算法
看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i( ...
- asp.net 小技巧
文字用一个label标签包起来,设置一个属性:for,其for的值要和复选框的id相同. <p> 1.通过点击文字,就选中复选框</p> <p>文字用一个label ...
- 在MAC系统上进行屏幕录制
最近打算将一些软件操作过程进行屏幕录制进行视频分享,所以寻思着找一块能在MAC上使用的屏幕录制软件.google了一番,没想到MAC系统自带的QuickTime Player已经内置屏幕录像功能,而且 ...
- Vivado HLS与System Generator:联系与区别
在很多年以前的ISE套件里面,有个功能强大的AccelDSP,它可以可自动地进行浮点到定点转换,并把算法生成可综合的HDL,还可以创建用于验证的测试平台,但是在4年前左右的时候销声匿迹了,当时的说法是 ...
- 可以支持jQuery1.10.1 的 fancybox 1.3.4, 並現在type為Ajax時,也可以定義窗口的大小。
官網上的 fancybox 1.3.4 太老了,不支持jQuery1.10.1,改動了一下源碼,現在可以支持了. type為Ajax時,也可以定義窗口的大小. $("#ajaxlink&qu ...
- vmware虚拟机上网:host-only
host-only配置 首先主机:vmware1要能共享本地连接这个网络,共享后vmware的ip会自动设置为如图 其次,vmware网络设置如图 最后,虚拟机设置如图 这样,主机与虚拟机之间就能pi ...
- 微软更换考试中心后报名攻略以及MCT半价
微软从Prometric更换为Pearson的考试中心,比起以前的预约流程更加便捷. Pearson VUE为微软公司提供MCP考试服务 Pearson VUE为微软公司提供MCP考试服务 http: ...
- 对现有Hive的大表进行动态分区
分区是在处理大型事实表时常用的方法.分区的好处在于缩小查询扫描范围,从而提高速度.分区分为两种:静态分区static partition和动态分区dynamic partition.静态分区和动态分区 ...