poj 4045 Power Station (树形dp)




本文出自   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: [email protected]
 *===========================================*/
#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;
vectoradj[MAXN];

int64 dfs(int u){
    vis[u] = true;
    // u为根节点的子树,方向往下,u到所有子节点的总距离
    f[u][0] = 0;

    // u为根节点的子树,方向往下,共有多少个结点
    num[u] = 1;  

    for(int i=0; i


你可能感兴趣的:(动态规划,ACM-ICPC征途)