本文出自 http://blog.csdn.net/shuangde800
题目链接:点击打开链接
poj没有题目描述,题目的pdf链接
题意
n个城市节点构成的一棵树,节点i到节点j的电量损耗为 I*I*R*(i到j的路径所含边数),现在要在某个结点上修建一个供电站,使得这个结点到所有其它节点的总损耗量最小。
思路
典型的树形dp
可以先用一次dfs求出每一点的子树结点个数num[u],以及每一点到它子树所有结点的总距离f[u][0];
然后再用一次dfs,推出每个结点到除去它子树部分的结点总距离f[u][1]。
f[v][1] = (f[u][0]-f[v][0]-num[v]) + f[u][1] + n - num[v];
代码
/**==========================================
* This is a solution for ACM/ICPC problem
*
* @source: poj-4045 Power Station
* @type: 树形dp
* @author: shuangde
* @blog: blog.csdn.net/shuangde800
* @email: zengshuangde@gmail.com
*===========================================*/
#include
#include
#include
#include
#include
#include
#include
using namespace std; typedef long long int64; const int INF = 0x3f3f3f3f; const double PI = acos(-1.0); const int MAXN = 50010; int64 f[MAXN][2]; int64 num[MAXN], ans; bool vis[MAXN]; int n, I, R; vector
adj[MAXN]; int64 dfs(int u){ vis[u] = true; // u为根节点的子树,方向往下,u到所有子节点的总距离 f[u][0] = 0; // u为根节点的子树,方向往下,共有多少个结点 num[u] = 1; for(int i=0; i