poj1655 树的重心 树形dp

处理处每个节点的孩子有几个,和树的大小就好了。

#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 99999999
using namespace std;
const int MAXN = 20010;
struct node
{
        int to;
        int v;
        int next;
}edge[MAXN*2];
int p,len;
int num[MAXN];
int vis[MAXN],pre[MAXN],ind,n;
int siz[MAXN];//the size of the tree
int h[MAXN];//the maxnum of subtree
int way;
void add(int x,int y)
{
        edge[ind].to = y;
        edge[ind].next = pre[x];
        pre[x] = ind ++;
}
void dfs1(int rt)
{
        int i;
        vis[rt] = 1;
        siz[rt] = 1;
        for(i=pre[rt]; i!=-1; i=edge[i].next){
                int t = edge[i].to;
                if(!vis[t]){
                        dfs1(t);
                        siz[rt] += siz[t];
                        h[rt] = max(h[rt],siz[t]);
                }
        }
}
int main()
{
        #ifndef ONLINE_JUDGE
        freopen("data.txt","r",stdin);
        #endif
        int i,j,t;
        scanf("%d",&t);
        while(t--)
        {
                scanf("%d",&n);
                ind = 1;
                memset(pre,-1,sizeof(pre));
                for(i=1; i<n; i++){
                        int x,y;
                        scanf("%d%d",&x,&y);
                        add(x,y);
                        add(y,x);
                }
                memset(vis,0,sizeof(vis));
                memset(siz,0,sizeof(siz));
                memset(h,0,sizeof(h));
                dfs1(1);
                int ans = INF;
                int f;
                for(i=1; i<=n; i++){
                    int temp = max(h[i],n-siz[i]);
                    if(ans > temp){
                        ans = temp;
                        f = i;
                    }
                }
                //cout<<siz[1]<<endl;
                cout<<f<<" "<<ans<<endl;
        }
}
时间: 2024-10-01 10:28:05

poj1655 树的重心 树形dp的相关文章

POJ 1655 Balancing Act[树的重心/树形dp]

Balancing Act 时限:1000ms Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or more trees. Define the balance of a node to be the size of the largest tree

POJ 1655 BalanceAct 3107 Godfather (树的重心)(树形DP)

参考网址:http://blog.csdn.net/acdreamers/article/details/16905653 树的重心的定义: 树的重心也叫树的质心.找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 通常利用树形DP找重心: BalanceAct: http://poj.org/problem?id=1655 题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最

POJ 1655 Balancing Act(求树的重心--树形DP)

题意:求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的. 思路:随便选一个点把无根图转化成有根图,dfs一遍即可dp出答案 //1348K 125MS C++ 1127B #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; int

poj1655 Balancing Act 【树形DP(很弱)】

都不知道怎么分类了. 大概要求一个树中以某个结点为根的子树结点个数,还有儿子结点中以儿子结点为根的子树结点个数的最大值,用递归得到n[i],以i为根节点的子树结点个数 #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <cmath&g

2014 Super Training #9 E Destroy --树的直径+树形DP

原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其他点的最远距离最小).现在你要破坏所有叶子节点到根节点的连通,每条边破坏都需要一定能量.你有一个能量为power的武器,能破坏能量小于等于power的任何路.求最少需要的power. 解法参考博客:http://blog.csdn.net/gzh1992n/article/details/86511

cqyz oj | 树的分治 | 树形DP | 树的重心

Description 给定一棵N个节点的带权树,定义dist(u,v)为u,v两点间的最短路径长度,路径的长度义为路径上所有边的权和.再给定一个K,如果对于不同的两个结点a,b,如果满足dist(a,b)<=K,则称(a,b)为合法点对. 你的任务是求合法点对个数. Input 第一行包含两个个整数N和K,接下来的N-1行,每行包含三个整数:u,v,len,表示树边(u,v)的长度len. Output 一个整数,表示合法点对的数目. Sample Input 1 5 4 1 2 3 1 3

(中等) HDU 5293 Tree chain problem,树链剖分+树形DP。

Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are m chain on the tree, Each chain has a certain weight. Coco would like to pick out some chains any two of which do not share common vertices.Find out the

HDOJ 5293 Tree chain problem LCA+树链剖分+树形DP

[题意] 给定一颗树上的几条链和每条链的权值,求能取出的不含有公共节点的链的最大权值.... [解] 预处理每条链的lca 树形DP, d[i]表示取到这个节点时可以得到的最大值 , sum[i]=sigma( d[k] | k 是i的子节点) 如果不取i  d[i]=sum[i] 如果取i , e是lca为i的链则 d[i]=max(d[i],e的权值+sigma(sum[k])-sigma(d[k]))  k为树链上的点 可以用树链剖分+树装数组在nlogn的时间复杂度内求链上的值 Tree

[模拟赛10.12] 老大 (二分/树的直径/树形dp)

[模拟赛10.12] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n ? 1 条边的无向连通图),由于新建的办公室太大以至于要将奖杯要分放在两个不同的地方以便同学们丢硬币进去开光,OB 想请你帮帮他看看奖杯放在哪两个办公室使得在任意一个在劳模办公室做题的小朋友能最快地找到奖杯来开光. 一句话题意:给出一个 n 个点的树,在两个合适且不同的点放上奖杯,使得每个点到最近的奖杯距离最大值最小. 输入