题目链接:https://cn.vjudge.net/contest/277955#problem/D

题目大意:求树的重心(树的重心指的是树上的某一个点,删掉之后形成的多棵树中节点数最大值最小)。

具体思路:对于每一个点,我们求出以当前的点为根的根数的节点个数, 然后在求树的重心的时候,一共有两种情况,一种树去除该点后这个点的子节点中存在所求的最大值,还有一种情况是这个点往上会求出最大值,往上的最大值就是(n-dp[rt][0]).

AC代码:

#include<iostream>
#include<cmath>
#include<stack>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
# define inf 0x3f3f3f3f
# define ll long long
const int maxn = 2e5+100;
struct node
{int nex;int to;
} edge[maxn];
int num,head[maxn],dp[maxn][3],father[maxn];
int sto[maxn],minn,n;
void init()
{minn=inf;num=0;memset(head,-1,sizeof(head));memset(dp,0,sizeof(dp));
}
void addedge(int fr,int to)
{edge[num].to=to;edge[num].nex=head[fr];head[fr]=num++;
}
void dfs1(int fr,int rt)
{dp[fr][0]=1;for(int i=head[fr]; i!=-1; i=edge[i].nex){int to=edge[i].to;if(to==rt)continue;dfs1(to,fr);dp[fr][0]+=dp[to][0];}
}
void dfs2(int fr,int rt)
{dp[fr][1]=n-dp[fr][0];for(int i=head[fr]; i!=-1; i=edge[i].nex){int to=edge[i].to;if(to==rt)continue;dfs2(to,fr);dp[fr][1]=max(dp[fr][1],dp[to][0]);}minn=min(minn,dp[fr][1]);
}
int main()
{init();scanf("%d",&n);int t1,t2;for(int i=2; i<=n; i++){scanf("%d %d",&t1,&t2);addedge(t1,t2);addedge(t2,t1);}dfs1(1,-1);dfs2(1,-1);int flag=1;for(int i=1; i<=n; i++){if(dp[i][1]==minn){if(flag){printf("%d",i);flag=0;}elseprintf(" %d",i);}}printf("\n");return 0;
}

树形dp树的重心(D - Godfather POJ - 3107)相关推荐

  1. POJ - 4045 Power Station(树形dp/树的重心)

    题目链接:点击查看 题目大意:给出一个n个节点的树,我们需要选出一个节点,到其余任何节点的距离和最小 题目分析:这个题我的第一反应是用树的重心,先求出来符合条件的点,然后再跑一遍dfs求距离,最后输出 ...

  2. 树形dp——树的重心(2) 代码调试理解

    和树的最大独立问题类似,先任选一个结点作为根节点,把无根树变成有根树,然后设d(i)表示以i为根的子树的结点的个数.不难发现d(i)=∑d(j)+1,j∈s(i).s(i)为i结点的所有儿子结点的编号 ...

  3. 树形dp ——树的重心

    1.只需要求出最大子树中节点数最小的数目即可 题意:有一个国王要把他的领土分给两个儿子,国王的领土是一棵树,N个结点,N-1条边把这些结点连起来,现在大小儿子要选择一个点作为他的首都,那么除首都分别是 ...

  4. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  5. Godfather POJ - 3107 (求树的重心)

    题目链接 题意:给定一棵树,要求按编号从小到大输出重心. 树的重心: 定义:找到一个点满足其所有的子树中最大的子树节点数最少,那么这个点就算是树的重心. 性质: 1.删除重心后所得的所有子树,节点数不 ...

  6. [BZOJ3197][Sdoi2013]assassin(树形DP+树同构+二分图最优匹配)

    关于树同构,有一个神奇的性质: 一棵树的重心只有 111 个或 2" role="presentation" style="position: relative ...

  7. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

  8. POJ 3107 Godfather(树形DP(找重心))

    任重而道远 Description Last years Chicago was full of gangster fights and strange murders. The chief of t ...

  9. Godfather POJ - 3107 树的重心

    题目要求输出给出树的所有重心. 有个结论:一棵有根树至多有两个重心. #include<iostream> #include<cstring> using namespace ...

最新文章

  1. Netty 入门示例
  2. Android React Native 笔记(二):Component生命周期
  3. Make Them Equal 埃氏筛法(1200)
  4. 使用gulp-connect实现web服务器
  5. 一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为
  6. TV3是马来西亚第一家商营电视台
  7. Docker内核参数优化
  8. exchange2010 取消OWA内更改密码选项
  9. Wannafly挑战赛9: B. 数一数
  10. (原创)EDK中常用文件
  11. 页面编码和js文件不同导致的IE6下脚本错误
  12. 微信小程序(第二章)- 开发工具的下载和安装
  13. 万物之始,大道至简,衍化至繁
  14. 【高并发】假如你网站一天有千万级访问量高并发,如何破解?
  15. YOLO-先验框/anchor(锚点)
  16. 小说网站源码开源,支持爬虫和原创双模式,小说自动采集/更新/纠错
  17. 计算机专业对数学英语要求高吗,大学专科计算机专业对英语数学的要求高么
  18. 什么是JavaScript,JavaScript的特点,JavaScript的作用
  19. Java新手上路--算数运算符
  20. 1075 PAT Judge 测试点四

热门文章

  1. 立春时节到,VR购物大杀器来袭
  2. 机器视觉的洪荒之力助中国制造2025“看”得更远
  3. Apple Watch必备? 高逼格精品周边配件盘点
  4. lisp绘制棱锥_椭圆轴棱锥,elliptical axicon,音标,读音,翻译,英文例句,英语词典
  5. 深度思考:变好,是对看不起你的人最有力的还击
  6. 类图中类与类之间的关系重点区分
  7. 利用DPCM编码进行图像压缩
  8. 中国申请英国留学人数创新高,东伦敦成最受家长青睐“以房养学”地区
  9. CrawlSpider爬取拉钩
  10. 用聚合数据苏州实时公交API写的微信小程序