题意:

  王国地图为 n 个节点的根树,首都为 1,

  m 个旅行家要去不同的终点旅游,他们分别有各自的预算,如果路上总费用超过预算就不去了

  给每条路定价, 让赚的钱最多

分析:

    DP[i][j]表示当从首都到城市i的路径花费为j时,以i为根的子树中的点作为目的城市的旅行者的最大花费.

  只需要考虑j值等于0或等于某位旅行者预算的情况,所以dp的状态数是O(NM)的.

  状态转移方程式:

  DP[i][j] = j* n(i,j) + ∑​max(DP[k][j​i]) (ji >= j)
    

    ( n(i,j)为以i作为目标城市且预算不小于j的旅行者数量,

      k 为 i 的所有子代节点

      ​max(DP[k][j​i]) 为节点k的所有ji >= j 的 DP[k][j​i] 的最大值 )

  上式max(DP[k, j​i]) (ji >= j) 可用 DP[i][j] = max(DP[i][j], DP[i][j+1]) 递推而得
则转移方程式为:

DP[i][j] = j* n(i,j) + DP[i][j].

  确定完每一点的最大花费总和后,两点的最大花费总和相减即为该边的定价

  注意起点的花费一定为 0 !

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define LL long long
const int MAXN = ;
int t, n, m, s;
vector<int> mp[MAXN], id[MAXN];
LL dp[MAXN][MAXN];
LL v[MAXN];
int edge[MAXN][MAXN];
int bst[MAXN][MAXN];
LL ans[MAXN];
LL a[MAXN];
void DFS(int x,int fa)
{
for (int i = ; i < mp[x].size(); i++)
{
if (mp[x][i] != fa) DFS(mp[x][i], x);
}
for (int j = s-; j >= ; j--)
{
int t = ;
for (int i = ; i < id[x].size(); i++)
if (a[id[x][i]] >= v[j]) t++;
dp[x][j] += t*v[j]; //j* n(i,j)
for (int i = ; i < mp[x].size(); i++)
{
if (mp[x][i] == fa) continue;
int p = mp[x][i];
dp[x][j] += dp[p][j];
}
if (j == s- || dp[x][j+] <= dp[x][j])
{
bst[x][j] = j;
}
else
{
dp[x][j] = dp[x][j+];
bst[x][j] = bst[x][j+];
}
}
}
void DFS2(int x,int a,int fa)
{
for (int i = ; i < mp[x].size(); i++)
{
int e = mp[x][i];
if (e == fa) continue;
int b = bst[e][a];
ans[edge[x][e]] =v[b]- v[a];
DFS2(e,b,x);
}
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) mp[i].clear(), id[i].clear();
memset(dp,,sizeof(dp));
for (int i = ; i < n ;i++)
{
int u,v; scanf("%d%d", &u, &v);
mp[u].push_back(v);
mp[v].push_back(u);
edge[u][v] = edge[v][u] = i;
}
for (int i = ; i <= m; i++)
{
int u; scanf("%d%lld",&u, &a[i]);
v[i] = a[i];
id[u].push_back(i);
}
id[].clear();//起始点不计费!
v[] = ;
sort(v,v++m);
s = unique(v,v++m) - v;
DFS(,-);
DFS2(,,-);
printf("%lld\n",dp[][]);
for (int i = ; i < n-; i++)
printf("%lld ",ans[i]);
printf("%lld\n", ans[n-]);
}
}

HDU 5815 - Golden Week的更多相关文章

  1. HDU 3820 Golden Eggs (SAP | Dinic)

    Golden Eggs Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. HDU 4814 Golden Radio Base 小模拟

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题意:黄金比例切割点是,如今要求把一个10进制的的数转化成一个phi进制的数,而且不能出现'11'的 ...

  3. HDU 4814 Golden Radio Base 模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题目大意: 把一个正整数表示为φ进制, φ = (1+√5)/2 . 且已知: 1. φ + 1 ...

  4. HDU 4818 Golden Radio Base (2013长春现场赛B题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 进制转换. 现场根据题目给的两个公式,不断更新!!! 胡搞就可以了. 现场3A,我艹,一次循环开 ...

  5. HDU 3820 Golden Eggs

    http://acm.hdu.edu.cn/showproblem.php?pid=3820 题意:n*m的格子,每个格子放金蛋或银蛋,每个格子的金蛋和银蛋都有一个对应的点权,如果有两个金蛋相连,则需 ...

  6. HDU 3820 Golden Eggs( 最小割 奇特建图)经典

    Golden Eggs Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. hdu 4814 Golden Radio Base

    详解见:http://blog.csdn.net/tri_integral/article/details/18666797 #include<cstdio> #include<cs ...

  8. Todo List

    Contest 11.13 2016ACM/ICPC亚洲区青岛站(5/13, solved 7/13) Training 11.06 2016年中国大学生程序设计竞赛(合肥)(solved 6/10) ...

  9. Golden Eggs HDU - 3820(最小割)

    Golden Eggs Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. unity 之2D游戏简单操作

    unity 做2D项目也很方便.  首先要调整camera的模式,camera 的检视面板参数如下: perspective 模式就是平时用的 模式.摄像机到游戏物体是有角度的张开, 而 orthog ...

  2. BZOJ 2243 SDOI 2011染色

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 算法讨论: 树链剖分把树放到线段树上.然后线段树的每个节点要维护的东西有左端点的颜色 ...

  3. Android 多渠道打包,上百渠道,秒打签名

    具体工具参见:https://github.com/hpu-spring87/MultiSignTools

  4. WordPress nginx环境下开启多站点

    在wp-config.php插入 define('WP_ALLOW_MULTISITE', true); 进入管理页面安装网络,子目录模式按提示再在wp-config.php插入 define('MU ...

  5. 【笔记】Unix 平台标准

    POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEE ...

  6. MHA环境搭建【4】manager相关依赖的解决

    mha的manager 结点依赖与mha-node软件包.所以在安装mha-manager之前要把mha-node安装上去:再者mha-manger还依赖于perl-Config-Tiny perl- ...

  7. 深入理解Azure自动扩展集VMSS(1)

    前文中已经详细介绍了如何配置和部署Azure的虚拟机扩展集VMSS进行自动扩展,但在实际使用过程当中,用户会出现更进一步使用的一些问题,VMSS基本扩展原理及怎么简单调试?如何进行手动扩展?怎么使用自 ...

  8. commons.fileupload简单应用

    导入包: commons-fileupload-1.3.1.jar commons-io-2.4.jar commons-fileupload依赖于commons-io,commons-io-2.4必 ...

  9. linux下C和shell调用的popen函数

    说明:      本文介绍popen函数的使用方法和行为机理,并给出实际的例子来辅助说明了popen函数的使用方法. popen函数使用FIFO管道执行外部程序,首先让我们看看popen的函数原型吧: ...

  10. wikioi1369 xth 砍树

    题目描述 Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴, 小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着 r ...