SGU 134 Centroid
来源:互联网 发布:深圳税友软件 编辑:程序博客网 时间:2024/06/05 02:28
题意:给出一个树,每个点有一个value,value的意义是去掉这个点之后所有连通分量中点最多的那个连通分量的点数,这棵树的重心为所有点value的最小值,求重心,及重心都有谁。
解法:貌似是个树形dp,不过不太懂树形dp···学了一下也没太明白这题为啥是树形dp···觉得其实是深搜···嗯···
随便找一个点当做根,我选了点1,每个点的value = max{max{sum[j]}, n - sum - 1},sum为所有儿子为根时的节点个数,直接搜就好。
对了···多组输入会PE···坑爹的OJ···
代码:
#include<stdio.h>#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<math.h>#include<limits.h>#include<time.h>#include<stdlib.h>#include<map>#include<queue>#include<set>#include<stack>#include<vector>#define LL long longusing namespace std;vector <int> al[16005];//邻接表存边int n;int dp[16005];int dfs(int v, int u){ int len = al[v].size(); int res = 0, sum = 0; for(int i = 0; i < len; i++) { if(al[v][i] != u)//判断是不是父亲节点 { int tmp = dfs(al[v][i], v); res = max(res, tmp); sum += tmp; } } dp[v] = max(res, n - sum - 1); return sum + 1;}int main(){ scanf("%d", &n); memset(dp, -1, sizeof(dp)); for(int i = 0; i < n - 1; i++) { int v, u; scanf("%d%d", &v, &u); al[v].push_back(u); al[u].push_back(v); } dfs(1, 0); int ans = 16005; for(int i = 1; i <= n; i++) ans = min(ans, dp[i]); int prt[16005] = {0}; int cnt = 0; for(int i = 1; i <= n; i++) if(dp[i] == ans) prt[cnt++] = i; printf("%d %d\n", ans, cnt); for(int i = 0; i < cnt; i++) { if(i) printf(" "); printf("%d", prt[i]); } printf("\n"); return 0;}
0 0
- SGU 134 Centroid
- sgu 134 Centroid
- SGU 134 Centroid
- SGU 134 Centroid(树形dp)
- SGU 134 Centroid 树形DP
- SGU 134 Centroid【树的重心】
- sgu 134 Centroid 树的重心
- SGU 134 Centroid (树的重心)
- SGU - 134 Centroid 无根树转有根树 + 树形DP
- SGU 134 Centroid(树形DP)
- SGU 134 Centroid(树的重心)
- [SGU]134. Centroid
- SGU 134 Centroid (树形dp 求树的中心)
- SGU 134. Centroid 树的dfs遍历
- SGU 134. Centroid(树的重心)
- sgu 134
- SGU134 Centroid
- sgu134:Centroid
- OC_语法
- 代码大全第二版读书笔记 第四部分-语句 十七、不常见的控制结构
- OC_语法
- Apache+Tomcat实现集群及多应用对应多域名
- OC_语法
- SGU 134 Centroid
- HDFS基本操作
- 如何在vi中优雅地使用ex
- 黑马程序员——Java基础IO(一)——IO流概述、字符流、字节流、流操作规律
- JStat监控JVMGC内存
- 个人感受
- POJ 3164 Command Network(最小树形图模板)
- OC_ 对象与函数
- HDU 2082 找单词 (母函数)