T3:blockenemy

blockenemy.pas/in/out 128M 1s

你在玩电子游戏的时候遇到了麻烦。。。。。。

你玩的游戏是在一个虚拟的城市里进行,这个城市里有n个点,都从0~n-1编了号,每两个点之间有且仅有一条路径。现在,你的敌人到这个城市来踩点了!!!为了阻止他们更好的踩点,

你决定切断他们所有踩点人员的联系,使他们孤军作战,然后在各个击破。但是这就要切断某些街道,而你每切断一条路,市民就会产生相对的不满值,不满值越大,城市的和谐度就越小。所以你现在需要知道为了使踩点人员所在的点两两之间不联通所切断的边产生的最小不满值是多少?

Input

第一行一个数:n  n<=50

以下n-1行,每行3个数 a,b,c  表示a点和b点之间有条路,切断这条路的不满值为c

以下若干行  每行一个数,表示踩点人员的位置

Output

一个数,最小不满值

Sample Input

5

1 0 1

1 2 2

0 3 3

4 0 4

3

2

4

Sample Output

4

据说这道题有许多做法,直接复制题面的第一句话到百度里搜索,就会有别人的做法,我的做法是std的,想了好久才搞定。

对于每个节点i,令f(i, 0)表示以i为根的子树中,全部敌人两两不连通,且全部都无法到达点i的最小值;f(i, 1)表示以i为根的子树中,全部敌人两两不连通,但有1个敌人可以到底点i的最小值。状态设计好了,接下来就是分两种情况转移:

情况①:若i这个点有敌人。显然,f(i, 0)肯定为inf了,因为不可能做到“全部都无法到达点i”。f(i, 1) = sigma(min(f(j, 1) + w(i, j), f(j, 0))),其中j属于i的儿子。

情况②:若i这个点没敌人。那么

f(i, 0) = sigma(min(f(j, 1) + w(i, j), f(j, 0))),其中j属于i的儿子。

f(i, 1)的转移有那么一丢丢难想。f(i, 1)一定实在f(i, 0)的基础上,使得某个儿子从不能到达i,变成能到达i,即对于儿子j,对该状态的贡献由min(f(j, 1) + w, f(j, 0))变为f(j, 1).如果这样的话,f(i, 1)就会在f(i, 0)的基础上减去min(f(j, 1) + w, f(j, 0)) - f(j, 1),那么这个值越大,f(i, 1)就会越小。

#include <cstdio>
#include <cstdlib>
#include <cstring> const int maxn = 55; int n, t1, t2, t3, root, f[maxn][2];
bool book[maxn];
struct graph {
int head[maxn], to[maxn << 1], next[maxn << 1], w[maxn << 1], lb;
graph(void) {
memset(head, -1, sizeof head);
memset(next, -1, sizeof next);
lb = 0;
}
void ist(int aa, int ss, int ww) {
to[lb] = ss;
w[lb] = ww;
next[lb] = head[aa];
head[aa] = lb;
++lb;
}
} g; inline int minn(int aa, int ss) {
return aa < ss? aa: ss;
}
inline int maxx(int aa, int ss) {
return aa > ss? aa: ss;
}
void dfs(int r, int p) {
if (book[r]) {
f[r][0] = 0x3c3c3c3c;
for (int j = g.head[r]; j != -1; j = g.next[j]) {
if (g.to[j] != p) {
dfs(g.to[j], r);
f[r][1] += minn(f[g.to[j]][1] + g.w[j], f[g.to[j]][0]);
}
}
}
else {
int mx = 0, mn;
for (int j = g.head[r]; j != -1; j = g.next[j]) {
if (g.to[j] != p) {
dfs(g.to[j], r);
mn = minn(f[g.to[j]][0], f[g.to[j]][1] + g.w[j]);
f[r][0] += mn;
mx = maxx(mx, mn - f[g.to[j]][1]);
}
}
f[r][1] = f[r][0] - mx;
}
} int main(void) {
freopen("blockenemy.in", "r", stdin);
freopen("blockenemy.out", "w", stdout);
scanf("%d", &n);
unsigned seed;
for (int i = 1; i < n; ++i) {
scanf("%d%d%d", &t1, &t2, &t3);
seed += t1 + t2 + t3;
g.ist(t1, t2, t3);
g.ist(t2, t1, t3);
}
while (scanf("%d", &t1) != EOF) {
book[t1] = true;
seed += t1;
} srand(seed);
root = rand() % n;
dfs(root, -1);
printf("%d\n", f[root][1]);
return 0;
}

  

[ZPG TEST 108] blockenemy【树形dp】的更多相关文章

  1. [vijos 1642]班长的任务 [树形dp]

    背景 十八居士的毕业典礼(1) 描述 福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和 ...

  2. [CEOI2007]树的匹配Treasury(树形DP+高精)

    题意 给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配时多少,并且计算出有多少种最大匹配. N≤1000,其中40%的数据答案不超过 108 题解 显然的树形DP+高精. 这题是作为考试题考 ...

  3. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  4. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  5. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  6. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  7. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  8. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  9. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

随机推荐

  1. 限制input的输入类型

    1.只能输入和粘贴汉字 <input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste= ...

  2. FFMpeg2.4.2 on Ubuntu14.04

     FFmpeg 2.4 "Fresnel" – is the leading multimedia framework, cross-platform solution tha ...

  3. java里int类型转byte类型

    今天在做书上的一个例子的时候, 要使用byte类型,首先我很直接的就写到了byte b = 0XAA, 结果报错, 说从int转换到byte可能会有损失. 我当时就很奇怪, 为什么会出现这种情况呢? ...

  4. 自定义实现JavaScript的Map对象,修改IE不兼容MAP()的问题

    由于IE8及以下版本不支持Map对象,本文为程序猿们提供了有效的解决方法. 本文重写了Map对象,实现了常用的set, get, put, clear, remove, delete, forEach ...

  5. shell操作Hbase

    status:查询集群的一些状态 hbase(main):002:0> status1 active master, 0 backup masters, 1 servers, 0 dead, 3 ...

  6. UVa 10773 - Back to Intermediate Math

    题目:渡河问题.给你河水宽度,水流速度,求垂直渡河与最快渡河的时间差. 分析:物理题,数学题. 最快渡河情况,传垂直运动,垂直渡河,船的水平分速度和水流速度抵消. 说明:注意水流速度不能为0. #in ...

  7. hdu 1251 统计

    他妹的.敲完了.电脑死机了,所有消失了,又从新打了一遍,... 这是什么节奏 #include <stdio.h> #include <string.h> #include & ...

  8. 对ASP.NET MVC 的路由一点理解

    这个东西,真搞不懂.看了网上的教程和文章,也不懂(也不清楚写那些文章的人自己是否真的懂).只好靠自己一顿乱摸索. 好比说,下面这个路由: //路由1 config.Routes.MapHttpRout ...

  9. Java小白手记:SSH

    以下内容只是一个小白菜鸟的理解和总结,目的仅在于梳理思路. 13年的时候,我就说要学JAVA,有个C++高手同事赞许地说:"嗯,不错,SSH..."我不禁肃然起敬.SSH!多么高大 ...

  10. The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF

    打开表单偶尔会出现这个提示,解决方法: web.config增加配置: <configuration> <system.net> <settings> <ht ...