【树形dp】PKU-3107-Godfather

原创 2012年03月23日 14:43:32

题目要求找到这样的一个点,当删除这个点后使得形成的深林的最大的子树的节点最小。而且这些点可能有多个,请一一输出。其实这道题就是1655的翻版,不过在这道题中不能用stl中的vector,因为会超时,所以要用邻接表来存储。

题目

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
using namespace std;
#define FRE freopen("a.txt","r",stdin);
#define inf 999999999
#define N 50005
struct
{
    int v,next;
}edge[2*N];
int k,head[N];
void addedge(int u,int v)
{
    edge[k].v=v;
    edge[k].next=head[u];
    head[u]=k++;
}
int n,dp[N];
int dfs(int now,int pre)
{
    int t,m=-1,sum=1;
    for(int i=head[now];i!=-1;i=edge[i].next)
    {
        int u=edge[i].v;
        if(u==pre)continue;
        m=max(m,t=dfs(u,now));           //找以now为跟的树的含节点数最多的子树
        sum+=t;           //以now为跟的树的节点和,不过这里不包括以pre为跟的子树的节点数
    }
    dp[now]=max(n-sum,m);           //n-sum表示以pre为跟的子树的节点数,m表示以now为跟的树的含节点数最多的子树
    return sum;
}
int main()
{
    //FRE;
    while(scanf("%d",&n)!=EOF)
    {
        memset(head,-1,sizeof(head));
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            addedge(x,y);
            addedge(y,x);
        }
        dfs(1,0);
        int m=inf;
        vector<int> p;
        p.clear();
        for(int i=1;i<=n;i++)
        {
            if(dp[i]==m)p.push_back(i);
            if(dp[i]<m)
            {
                p.clear();
                p.push_back(i);
                m=dp[i];
            }
        }
        int flag=0;
        for(int i=0;i<p.size();i++)
        {
            if(flag)printf(" ");
            flag=1;
            printf("%d",p[i]);
        }
        printf("\n");
    }
    return 0;
}


树形 DP 总结

一、介绍 1、什么是树型动态规划  顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有...
  • AngOn823
  • AngOn823
  • 2016年08月27日 14:12
  • 1664

树形DP—依赖背包模板

void DP(int x){ for(int i=0;i
  • xlzhang223
  • xlzhang223
  • 2016年03月12日 12:25
  • 236

树形DP总结,持续更新

树形DP总结,持续更新
  • Dacc123
  • Dacc123
  • 2016年01月03日 18:09
  • 406

树形dp 小结

只能勉强称之为树形dp的傻逼问题:[POJ1655]Balancing Act 树的重心,经典问题,但是非常简单啊。。。 用size维护一下就好辣! [BZOJ2435][Noi2011]道路修...
  • Clove_unique
  • Clove_unique
  • 2016年11月17日 22:32
  • 562

树形动态规划(树状DP)小结

树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系。利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索...
  • txl16211
  • txl16211
  • 2015年04月29日 23:10
  • 9904

树形动态规划(树形DP)入门问题—初探 & 训练

树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的...
  • txl16211
  • txl16211
  • 2015年04月29日 22:40
  • 10010

hdoj1561The more, The Better(树形dp,依赖背包)

题目:hdoj1561The more, The Better 题意:ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得...
  • y990041769
  • y990041769
  • 2014年07月23日 17:57
  • 3175

树形DP整理小结

树形DP: 在树上进行dp,树是递归的定义的,所以树形dp也是递归的求解,一般而言,dp[node]表示的是以node为根的子树能得到的最优解 一般而言,dp[node]需要从node的子结点进行状态...
  • tomorrowtodie
  • tomorrowtodie
  • 2016年08月24日 15:38
  • 985

树形dp学习

系统性的学习下树形dp。。虽然时间不太够了。。但是搏一搏,单车变摩托的道理还是要信的。。。。之前的太零散了,感觉很弱鸡。。。。 1.Hdu 2196 Computer  网上流传很广的一道求树的直径...
  • carryheart
  • carryheart
  • 2016年09月27日 20:48
  • 207

几道树形DP题

没有上司的舞会题目描述 Description Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个...
  • RedPolya
  • RedPolya
  • 2016年12月02日 20:27
  • 527
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【树形dp】PKU-3107-Godfather
举报原因:
原因补充:

(最多只允许输入30个字)