POJ 3107 Godfather
2012-10-19 12:20
267 查看
Godfather
树形DP简单题,就是找到这样的点:删除该点后最大的连通子树所包含的节点个数最小。然后将这些点依次输出。dp[i] = max{dp[j] , n-number} , j是i的儿子节点,number是i所在子树的总结点个数。
树形DP简单题,就是找到这样的点:删除该点后最大的连通子树所包含的节点个数最小。然后将这些点依次输出。dp[i] = max{dp[j] , n-number} , j是i的儿子节点,number是i所在子树的总结点个数。
#include <cstdio> #include <cstring> #include <vector> #define maxn 50005 using std::vector ; int n ; int result ; int dp[maxn] ; vector<int>G[maxn] ; int dfs(int v , int f){ int ans = 1 ; for(int i = 0 ; i != G[v].size() ; i ++){ int u = G[v][i] ; if(u == f){ continue ; } int tmp = dfs(u , v) ; ans += tmp ; if(dp[v] < tmp) dp[v] = tmp ; } if(n - ans > dp[v]){ dp[v] = n - ans ; } result = result < dp[v] ? result : dp[v] ; return ans ; } int main(){ scanf("%d" , &n) ; int a , b ; for(int i = 1 ; i < n ; i ++){ scanf("%d%d" ,&a , &b) ; G[a].push_back(b) ; G[b].push_back(a) ; } result = 50005 ; dfs(1 , 0) ; int flag = 0 ; for(int i = 1 ; i <= n ; i ++){ if(dp[i] == result){ if(flag) putchar(' ') ; printf("%d" , i) ; flag = 1 ; } } printf("\n") ; return 0 ; }
相关文章推荐
- POJ 3107 Godfather
- 【求树的重心】POJ - 3107 Godfather
- poj 3107 Godfather(树的重心问题)
- POJ 3107 Godfather
- poj 3107 Godfather(树形dp)
- POJ 3107 Godfather(树形DP)
- POJ 3107 Godfather(DFS)
- POJ 3107 Godfather
- POJ 3107 Godfather
- poj 3107 Godfather 求树的重心
- POJ - 3107 Godfather【树形dp+树的重心】
- POJ 3107 Godfather(树的重心)
- poj 3107 Godfather(树形dp)
- POJ 3107 Godfather 笔记
- POJ 3107 Godfather
- (POJ 3107 Godfather)树型DP + 删点
- 【dp每一天】POJ - 3107 Godfather (树形dp)
- [题解] POJ 3107 Godfather(树型DP 求树的直径)
- POJ 3107 Godfather(树形dp)
- poj 3107 Godfather(树的重心)