【树形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;
}


相关文章推荐

poj 3107 Godfather(树形dp,树的重心)

先附上树的重心的定义:

【树形dp+前向星】Godfather POJ - 3107

Think: 1题意:给出一棵树,询问试探删除一个结点后可使得余下两个连通子图中的最大结点子图的结点数量是所有结点试探的最小值(找到一个点,其所有的子树中最大的子树节点数最少) 树的重心——参考自...

Pku3107 Godfather

Pku3107 Godfather

动态规划 DP-1 与邻接表:Godfather POJ - 3107

树形DP,利用邻接表存储树
  • DMW2016
  • DMW2016
  • 2017年02月19日 09:41
  • 106

poj 3107Godfather 树型dp或者dfs(简单的树的操作)

题目:poj 3107Godfather 题意:给定一棵无根树,删除树中一个节点,使得剩下各子树的包含的节点数最大值最小,问树中有多少个这样的节点? 然后字典序输出。 解题:遍历一遍所有节点就可以...

poj3107(树形dp)

Godfather Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5586   Acce...
  • d_x_d
  • d_x_d
  • 2015年11月26日 16:53
  • 1173

POJ3107&&POJ1655【树形DP/简单搜索】

写完1655无聊翻了翻discuss,然后顺便改改过了3107…定义一个节点的节点的平衡值为删除这个节点后产生分支连通块元素最大的数量。POJ3107题意:给一颗n个结点的树,节点编号为1~n, 可...

Poj 3107 Godfather (树的重心)

题意:给定一棵树,求树的所有重心,按照编号从小到大的顺序输出.

POJ3107——Godfather

Godfather Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4853   Acce...

poj 3107 Godfather

题目大意就是让你找,删除一个点,使得身下的zis
  • tjqACM
  • tjqACM
  • 2014年10月23日 18:55
  • 316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【树形dp】PKU-3107-Godfather
举报原因:
原因补充:

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