POJ 3107 Godfather (树形dp)
虽然题目不难,但是1A还是很爽, 只是刚开始理解错题意了,想了好久。 还有据说这个题用vector会超时,看了以后还是用邻接吧。
题意:
给一颗树,保证是一颗树,求去掉一个点以后的联通块里节点的数目的 最大值最小,求这样的点,并按照递增顺序输出。
分析:
d[father] = max(n-sum, d[son]); sum代表这个节点以下的全部节点总数, 去掉一个节点的联通块的最大的节点数 等于 整个树里的节点数减去这个节点下的总数 和 子树的数目的
最大值。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#define LL __int64
const int maxn = +;
const int INF = <<;
using namespace std;
int head[maxn], vis[maxn], t, d[maxn];
int mi, n;
struct node
{
int u, v, ne;
}e[*maxn]; void add(int u, int v)
{
e[t].u = u;
e[t].v = v;
e[t].ne = head[u];
head[u] = t++;
}
int dfs(int son, int fa)
{
int i, tmp, sum = , x; //sum是以son为根节点的子树的全部的节点数
for(i = head[son]; i != -; i = e[i].ne)
{
tmp = e[i].v;
if(tmp == fa) continue; //避免回去。
x = dfs(tmp, son);
sum += x;
d[son] = max(d[son], x);
}
d[son] = max(d[son], n-sum);
if(d[son]<mi)
mi = d[son];
return sum;
}
int main()
{
int i, f;
while(~scanf("%d", &n))
{
memset(e, , sizeof(e));
memset(head, -, sizeof(head));
memset(vis, , sizeof(vis));
memset(d, , sizeof(d));
t = ;
mi = INF; for(i = ; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
dfs(, -); //把给的树看成以1为根节点。 f = ;
for(i = ; i <= n; i++)
{
if(d[i]==mi)
{
if(f)
printf(" %d", i);
else
printf("%d", i);
f = ;
}
}
printf("\n");
}
return ;
}
避免回去的时候也可以用vis[]来标记
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#define LL __int64
const int maxn = +;
const int INF = <<;
using namespace std;
int head[maxn], vis[maxn], t, d[maxn];
int mi, n;
struct node
{
int u, v, ne;
}e[*maxn]; void add(int u, int v)
{
e[t].u = u;
e[t].v = v;
e[t].ne = head[u];
head[u] = t++;
}
int dfs(int son)
{
int i, tmp, sum = , x;
vis[son] = ;
for(i = head[son]; i != -; i = e[i].ne)
{
tmp = e[i].v;
if(vis[tmp]) continue;
x = dfs(tmp);
sum += x;
d[son] = max(d[son], x);
}
d[son] = max(d[son], n-sum);
if(d[son]<mi)
mi = d[son];
return sum;
}
int main()
{
int i, f;
while(~scanf("%d", &n))
{
memset(e, , sizeof(e));
memset(head, -, sizeof(head));
memset(vis, , sizeof(vis));
memset(d, , sizeof(d));
t = ;
mi = INF; for(i = ; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
dfs(); f = ;
for(i = ; i <= n; i++)
{
if(d[i]==mi)
{
if(f)
printf(" %d", i);
else
printf("%d", i);
f = ;
}
}
printf("\n");
}
return ;
}
POJ 3107 Godfather (树形dp)的更多相关文章
- POJ 3107.Godfather 树形dp
Godfather Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7536 Accepted: 2659 Descrip ...
- poj 3107 Godfather 求树的重心【树形dp】
poj 3107 Godfather 和poj 1655差不多,那道会了这个也就差不多了. 题意:从小到大输出树的重心. 题会卡stl,要用邻接表存树..... #include<iostrea ...
- POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)
关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...
- # [Poj 3107] Godfather 链式前向星+树的重心
[Poj 3107] Godfather 链式前向星+树的重心 题意 http://poj.org/problem?id=3107 给定一棵树,找到所有重心,升序输出,n<=50000. 链式前 ...
- [POJ 1155] TELE (树形dp)
题目链接:http://poj.org/problem?id=1155 题目大意:电视台要广播电视节目,要经过中转机构,到观众.从电视台到中转商到观众是一个树形结构,经过一条边需要支付成本.现在给你每 ...
- Apple Tree POJ - 2486 (树形dp)
题目链接: D - 树形dp POJ - 2486 题目大意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值 学习网址:https://blog.c ...
- Anniversary party POJ - 2342 (树形DP)
题目链接: POJ - 2342 题目大意:给你n个人,然后每个人的重要性,以及两个人之间的附属关系,当上属选择的时候,他的下属不能选择,只要是两个人不互相冲突即可.然后问你以最高领导为起始点的关系 ...
- POJ 3342 (树形DP)
题意 :给出一些上下级关系,要求i和i的直接上级不能同时出现,现在选出一些人构成一个集合,问你这个集合里面的最大人数是都少,同时给出这个最大的人数的集合是否唯一. 思路:树形DP,dp[i][0],表 ...
- POJ 2342 (树形DP)
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3863 Accepted: 2172 ...
- POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
树的重心的定义是: 一个点的所有子树中节点数最大的子树节点数最小. 这句话可能说起来比较绕,但是其实想想他的字面意思也就是找到最平衡的那个点. POJ 1655 题目大意: 直接给你一棵树,让你求树的 ...
随机推荐
- (转)Eclipse平台技术概述
转载:周金根 http://zhoujg.blog.51cto.com/1281471/516833 Eclipse:Eclipse平台技术概述 2010-10-19 13:35:00 标签:E ...
- Java中List、Set和Map的区别--转载
List按对象进入的顺序保存对象,不做排序或编辑操作.Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List).Map同样 ...
- HDU 2669 Romantic(扩展欧几里德, 数学题)
题目 //第一眼看题目觉得好熟悉,但是还是没想起来//洪湖来写不出来去看了解题报告,发现是裸的 扩展欧几里得 - - /* //扩展欧几里得算法(求 ax+by=gcd )//返回d=gcd(a,b) ...
- POJ 1939
#include<iostream> #include<iomanip> #define MAXN 10000 using namespace std; ]; int main ...
- ListView中EditText的数据加载错乱的问题
我在ListView中用BaseAdapter的getView()方法加载适配器,每个Item里有一个TextView和一个EditText,当我在第一个EditText里面输入数据,比如1234时, ...
- 用Python+Django在Eclipse环境下开发web网站【转】
一.创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置.也就是通过自动生成代码来建立一个Django项目--一个Django项目的设置集,包含了数据库配置.Django详细选项设 ...
- UITableViewController 滚动引起的cocos2d动画暂停问题的解决
UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续 ...
- JSON 与JAVA对象之间的转换(转)
JSON与XML两者目前在数据交互方面都有很高的使用率,随着现在SOA的兴起,异构系统的整合地位相应提高,本篇文章主要介绍JSON与JAVA对象之间的相互转换. 一.对普通类型的JSON模式的转换 一 ...
- Windows 下 玩转Node.JS
vs一直是用的比较舒服的IDE,一直期望可以支持Node.JS.终于找到了一个工具 NTVS(Node.JS Tool For VS). 主页:https://nodejstools.codeplex ...
- tomcat console
1.大家都知道,在Tomcat5及其以后的版本中,当启动tomcat之后,是看不到控制台中的manager应用的.Manager的应用还是很有好处的,可以直接在控制台上(类似于weblogic上的co ...