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 题目大意: 直接给你一棵树,让你求树的 ...
随机推荐
- MYSQL注入天书之数据库增删改介绍
Background-4 增删改函数介绍 在对数据进行处理上,我们经常用到的是增删查改.接下来我们讲解一下mysql 的增删改.查就是我们上述总用到的select,这里就介绍了. 增加一行数据.Ins ...
- ios下最简单的正则,RegexKitLite
ios下最简单的正则,RegexKitLite 1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中.备用地址:http://www.coco ...
- IOS第三方地图-百度地图集成
百度地图官网: http://developer.baidu.com/map/index.php?title=iossdk 照上面吧百度地图sdk集成到工程 然后在pilst文件中加入: 如果地图没有 ...
- HDU 1978 How many ways(动态规划)
How many ways http://acm.hdu.edu.cn/showproblem.php?pid=1978 Problem Description 这是一个简单的生存游戏,你控制一个机器 ...
- jvm性能调优---jstat的用法
Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令 ...
- NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别 ...
- 【uva1502/hdu4117-GRE Words】DP+线段树优化+AC自动机
这题我的代码在hdu上AC,在uva上WA. 题意:按顺序输入n个串以及它的权值di,要求在其中选取一些串,前一个必须是后一个的子串.问d值的和最大是多少. (1≤n≤2×10^4 ,串的总长度< ...
- select into from和insert into select from两种表复制语句区别
select into from和insert into select from两种表复制语句都是将源表source_table的记录插入到目标表target_table,但两句又有区别. 第一句(s ...
- [转载]U3d常规性能优化技巧
以下技巧并不是必须的,但是对于想要提升游戏性能的人来说应该还是很不错的. 优化的常规技巧 n 剖析你的游戏. 不要花费时间来优化那些晦涩的代码或者缩减图形文件的大小,除非这是你游戏的瓶颈.第一次剖析你 ...
- Cloudinsight Agent install script
#!/bin/bash # Cloudinsight Agent install script. set -e logfile="ci-agent-install.log" gis ...