SGU 134 Centroid(树形dp)
2014-03-31 17:32
381 查看
题目链接:SGU 134 Centroid
树形dp。
要找一个点所有子节点(包括这个点的父节点)中具有最大节点数的子节点有两个方向,一个是以这个这个点的所有真正子节点为根的树,另一个是以这个点的父节点为根的树。
这个点父节点那棵树的节点数 = n - (这个点所有子节点的节点数 + 这个点)。
树形dp。
要找一个点所有子节点(包括这个点的父节点)中具有最大节点数的子节点有两个方向,一个是以这个这个点的所有真正子节点为根的树,另一个是以这个点的父节点为根的树。
这个点父节点那棵树的节点数 = n - (这个点所有子节点的节点数 + 这个点)。
#include <iostream> #include <stdio.h> #include <vector> #include <cstring> #include <algorithm> using namespace std; const int MAX_N = 16000 + 100; const int MAX_M = MAX_N << 1; const int INF = (1 << 30); struct Edge { int v, next; }; Edge e[MAX_M]; vector <int> vec; int d[MAX_N], head[MAX_N]; int n, u, v, ans, cnt; void addEdge(int u, int v) { e[cnt].v = v; e[cnt].next = head[u]; head[u] = cnt; cnt++; } void dp(int u, int fa) { d[u] = 1; int temp = 0; int v; for(int i = head[u]; i != -1; i = e[i].next) { v = e[i].v; if(v == fa) //添加双向边的意义所在 continue; dp(v, u); d[u] += d[v]; temp = max(temp, d[v]);//从子节点中寻找 } temp = max(temp, n - d[u]);//父节点含节点数与子节点中含最大节点数的那个比较大小 if(temp < ans) { ans = temp; vec.clear(); vec.push_back(u); } else if(temp == ans) vec.push_back(u); } int main() { scanf("%d", &n); memset(head, -1, sizeof(head)); cnt = 0; ans = INF; for(int i = 1; i < n; i++) { scanf("%d%d", &v, &u); addEdge(u, v); addEdge(v, u); } dp(1, -1); printf("%d %d\n", ans, vec.size()); sort(vec.begin(), vec.end()); for(int i = 0; i < vec.size() - 1; i++) printf("%d ", vec[i]); printf("%d\n", vec[vec.size() - 1]); return 0; }
相关文章推荐
- SGU - 134 Centroid 无根树转有根树 + 树形DP
- SGU 134 Centroid [树形DP]
- SGU 134 Centroid 树形DP
- SGU 134 Centroid(树形DP)
- SGU134 Centroid 树形DP,dfs建树
- SGU 134.Centroid( 树形dp )
- SGU 134 Centroid (树形dp 求树的中心)
- 树形DP求树的重心 --SGU 134
- SGU 134 树形DP
- 树形DP求树的重心 --SGU 134
- hdu 4863 Centroid of a Tree(树形dp)
- HDOJ树形DP专题之Centroid
- SGU 143 Long Live the Queen(树形DP)
- SGU 149 Computer Network [树形DP]
- sgu134:Centroid
- 【HDU 4863 多校联合】Centroid of a Tree【树形DP】
- SGU134 Centroid
- SGU 134 Centroid 找树的重心 水题
- SGU - 143 Long Live the Queen 树形dp之加和问题
- SGU 134.Centroid(图心)