题意简述

给你一颗有n个点的树,每条边有边权,有一个警察一开始在点S,他的速度是1,即通过一条长度为x的边要花x单位时间。

有m个罪犯,一开始第i个在点x[i],他们的速度无限快。

如果罪犯和警察到达同一个点,那么罪犯会被抓住。

现在罪犯们想最大化最后一个被抓的时间,警察想最小化抓的时间。

求警察抓住所以罪犯的时间的最小值

题解思路

dp

dp[u][v][x][y] 表示从u走向v,以v为根的子树有x个罪犯,其余有y个罪犯

然后进行转移

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
const int INF = 0x3f3f3f3f;
int n, m, s, u, v, w, tmp, cnt, ans = INF, xx;
int h[60], nxt[120], to[120], c[60], sz[60];
int dis[60][60], f[2][60];
int dp[60][60][60][60];
inline mmin(int& x, const int& y) {if (x > y) x = y; }
inline mmax(int& x, const int& y) {if (x < y) x = y; }
inline void add_edge(const int& u, const int& v)
{
to[++cnt] = v;
nxt[cnt] = h[u];
h[u] = cnt;
}
void dfs(const int& u, const int& fa)
{
for (register int i = h[u]; i; i = nxt[i])
if (to[i] != fa)
{
dfs(to[i], u);
c[u] += c[to[i]];
}
}
int solve(const int& u, const int& v, const int& x, const int& y)
{
if (!x && !y) return 0;
if (!x) return INF;
if (dp[u][v][x][y] < INF) return dp[u][v][x][y];
if (sz[v] == 1) return (dp[u][v][x][y] = (solve(v, u, y, 0) + dis[u][v]));
for (register int i = h[v]; i; i = nxt[i])
if (to[i] != u)
for (register int j = 0; j <= x; ++j)
solve(v, to[i], j, x + y - j);
memset(f[1], 0, sizeof(f[1]));
f[tmp = 1][0] = INF;
for (register int i = h[v]; i; i = nxt[i])
if (to[i] != u)
{
tmp ^= 1;
memset(f[tmp], 0, sizeof(f[tmp]));
for (register int j = 0; j <= x; ++j)
for (register int k = 0; j + k <= x; ++k)
{
xx = solve(v, to[i], k, x + y - k);
mmax(f[tmp][j + k], std::min(f[tmp ^ 1][j], xx));
}
}
return (dp[u][v][x][y] = (f[tmp][x] + dis[u][v]));
}
int main()
{
scanf("%d", &n);
for (register int i = 1; i < n; ++i)
{
scanf("%d%d%d", &u, &v, &w);
add_edge(u, v); add_edge(v, u);
dis[u][v] = dis[v][u] = w;
++sz[u]; ++sz[v];
}
scanf("%d%d", &s, &m);
for (register int i = 1; i <= m; ++i) { scanf("%d", &tmp); ++c[tmp]; }
dfs(s, 0);
memset(dp, INF, sizeof(dp));
for (register int i = h[s]; i; i = nxt[i])
mmin(ans, solve(s, to[i], c[to[i]], m - c[to[i]]));
printf("%d\n", ans);
}

最新文章

  1. IO多路复用之epoll总结
  2. 队列中使用Database Driver
  3. python练习程序(c100经典例13)
  4. 完美完全卸载Oracle 11g数据库
  5. oppo X907刷机包 COLOROS 1.0 正式版公布 安卓4.2.2
  6. iOS 开发-单元测试
  7. Ubuntu server 14.04 交叉编译Unicorn-engine
  8. tab切换☆☆☆☆☆
  9. Spark调优与调试
  10. D - Zhenya moves from the dormitory URAL - 2015
  11. react按需加载(getComponent优美写法),并指定输出模块名称解决缓存(getComponent与chunkFilename)
  12. python 内置函数之lambda-filter-reduce-apply-map
  13. 动态添加select选项空选项问题
  14. opencv-Drawing Functions in OpenCV
  15. django模板报错:Requested setting TEMPLATE_DEBUG, but settings are not configured. You must either define
  16. OSPF-DR与BDR的选举及作用
  17. C# 对WinForm应用程序的App.config的加密
  18. 吴裕雄 python 机器学习——混合高斯聚类GMM模型
  19. ROS naviagtion analysis: costmap_2d--CostmapLayer
  20. SDUT OJ 顺序表应用4:元素位置互换之逆置算法

热门文章

  1. 剑指offer第二版-总结:二叉树的遍历
  2. CDQZ集训DAY6 日记
  3. SpringBoot工程热部署
  4. c++小游戏——俄罗斯方块
  5. 万字长文:ELK(V7)部署与架构分析
  6. Appium+python自动化(二十二)- 三个臭皮匠顶个诸葛亮-控件坐标获取(超详解)
  7. 为什么一直玩A股的股民转战去玩港美股了?港美股系统搭建!
  8. CF392BTower of Hanoi(记忆化搜索)
  9. 【Java中级】(二)集合框架
  10. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释