POJ 1655 求树的重心(树形dp)
题目链接
树的重心:
若树上的一个节点满足其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心。
1.任选一个点为根,只要统计出每个点的子树大小,就能很快求出每个点子树节点的数量的最大值。
2.求每个点子树的大小同样只需要自底向上的更新信息。
3.记sz[u]为子树u节点的数量(包括 u 本身)
4.sz[u] = 1 + 所有子节点v的sz之和
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <time.h>#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, a, b) for (int i = (int)(a); i >= (int)b; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)
#define rep(i, l, r) for (int i = (l); i <= (r); i++)
#define per(i, r, l) for (int i = (r); i >= (l); i--)
#define ms(x, y) memset(x, y, sizeof(x))
#define SZ(x) ((int)(x).size())using namespace std;typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef long long i64;
typedef vector<i64> vi64;
typedef vector<vi64> vvi64;
typedef pair<i64, i64> pi64;
typedef double ld;template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }const int maxn = 20000+100;
int tc, n, sz[maxn], fa[maxn], res[maxn];
vector<int> G[maxn];void init(int n) {memset(fa, 0, sizeof(fa));memset(sz, 0, sizeof(sz));for (int i = 1; i <= n; ++i) G[i].clear();
}
void dfs1(int x, int par) {sz[x] = 1;fa[x] = par;for (int i = 0; i < int(G[x].size()); ++i) {int to = G[x][i];if (to == par) continue;dfs1(to, x);sz[x] += sz[to];}
}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.precision(10);cout << fixed;
#ifdef LOCAL_DEFINEfreopen("input.txt", "r", stdin);
#endifscanf("%d", &tc);while (tc--) {scanf("%d", &n);init(n);for (int i = 0; i < n - 1; ++i) {int u, v;scanf("%d%d", &u, &v);G[u].push_back(v);G[v].push_back(u);}dfs1(1, 0);for (int i = 1; i <= n; ++i) {int maxx = n - sz[i];for (int j = 0; j < int(G[i].size()); ++j) {int to = G[i][j];if (to == fa[i]) continue; //!!maxx = max(maxx, sz[to]);}res[i] = maxx;}int ans = INT_MAX, node;for (int i = 1; i <= n; ++i) {if (res[i] < ans) {ans = res[i];node = i;}}printf("%d %d\n", node, ans);}#ifdef LOCAL_DEFINEcerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endifreturn 0;
}
POJ 1655 求树的重心(树形dp)相关推荐
- POJ 1655 Balancing Act[树的重心/树形dp]
Balancing Act 时限:1000ms Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered ...
- M - Kill the tree 计蒜客 - 42552(2019icpc徐州/树的重心/树形dp)
vj地址 题目大意:找到每一颗子树的重心 思路: 树的重心的性质: 树的重心如果不唯一,则至多有两个,且这两个重心相邻 通过连接一条端点分别在两个树的边,来将两个树合并成一个,那么新的重心肯定是在原来 ...
- Poj 1655 【树的重心】
题目链接:http://poj.org/problem?id=1655 题解: 设sum[i]为以i为根结点的树上有多少个结点,maxsum[i]为去掉i结点导致的森林中最大的树有多大 一开始建树时是 ...
- Godfather POJ - 3107 (求树的重心)
题目链接 题意:给定一棵树,要求按编号从小到大输出重心. 树的重心: 定义:找到一个点满足其所有的子树中最大的子树节点数最少,那么这个点就算是树的重心. 性质: 1.删除重心后所得的所有子树,节点数不 ...
- 【POJ - 2378】Tree Cutting(树形dp,树的重心变形)
题干: After Farmer John realized that Bessie had installed a "tree-shaped" network among his ...
- POJ 2342 | HDU 1520 Anniversary party 树形DP(入门题)
传送门:POJ 2342 题目大意: 有若干人参加一个聚会,如果两个人之间有直接的上下属关系,则只能去一个.每个人都有个高兴值,问高兴值之和最大是多少? 思路: 之前一直觉得树形DP比较难,现在发现树 ...
- 【POJ - 1947】Rebuilding Roads (树形dp,背包问题,树形背包dp)
题干: The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1. ...
- AcWing1073.树的中心(树形DP)题解
题目传送门 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值. 请你在树中找到一个点,使得该点到树中其他结点的最远距离最近. 输入格式 第一行包含整数 ...
- bzoj 3162: 独钓寒江雪 树哈希+树形dp
题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...
最新文章
- Office 2016 for Mac试用之Excel篇
- Bootstrap CustomBox 弹层
- 自定义按键_DNF手游:策划宣布新增自定义按键布局,期待手游新版本的到来
- 如何解决使用JSON.stringify时遇到的循环引用问题
- Java EE 6 VS Spring 3:Java EE杀死了Spring? 没门!
- 关于源码,反码,补码(正数--负数)---------(-128)自己的理解
- “睡服”面试官系列第二十篇之generator函数的异步应用(建议收藏学习)
- 苹果秋季新品将要发布,MacBook Pro都有哪些变化
- 记录C++ Builder 6.0开发过程中的一个linker error
- 给我一个及时的问候——XMPP
- Vue:net::ERR_CONNECTION_REFUSED
- Virtualbox以及VWare在Win10下的不兼容
- 拼多多爆款商品采集工具
- 微信小程序实现退款,Java版。
- 结构体数组 初始化(转)
- 《缠中说禅108课》44:小级别背驰引发大级别转折
- 区块链随机数-区块链随机数的实现方案
- 文创礼品受追捧 华丽跨界火出圈
- uni项目中如何实现微信小程序文件下载(包会)
- VirtualBox网络配置:NAT+Host-Only实现连接外网+主机互通