题意:

给定n个点的树,m个黑点

以下n-1行给出边和删除这条边的费用

以下m个黑点的点标[0,n-1]

删除一些边使得随意2个黑点都不连通。

问删除的最小花费。

思路:

树形dp

每一个点有2个状态,成为黑点或白点。

若本身这个点就是黑点那么仅仅有黑点一种状态。

否则能够觉得是子树中某个黑点转移上来。

所以dp[i][0]是i点为黑点的状态。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
const ll inf = 1e13;
#define N 100100
struct Edge{
int to; ll dis; int nex;
void put(){printf(" (%d,%lld)\n", to, dis);}
}edge[N*2];
int head[N], edgenum;
void init(){memset(head, -1, sizeof head); edgenum = 0 ;}
void add(int u, int v, ll d){
Edge E = {v, d, head[u]};
edge[edgenum] = E;
head[u] = edgenum++;
}
typedef long long ll;
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x <0) {
putchar('-');
x = -x;
}
if(x>9) pt(x/10);
putchar(x%10+'0');
} int n, black_num;
bool black[N];
ll dp[N][2];
void dfs(int u, int fa){
ll tmp = 0;
for(int i = head[u]; ~i; i = edge[i].nex){
int v = edge[i].to; if(v == fa)continue;
dfs(v, u);
tmp += min(dp[v][0] + edge[i].dis, dp[v][1]);
}
dp[u][0] = dp[u][1] = inf;
if(black[u]){
dp[u][0] = tmp;
}
else {
dp[u][1] = tmp;
for(int i = head[u]; ~i; i = edge[i].nex){
int v = edge[i].to; if(v == fa)continue;
dp[u][0] = min(dp[u][0], dp[v][0] + tmp - min(dp[v][0] + edge[i].dis, dp[v][1]));
}
}
}
ll solve(){
dfs(0, 0);
if(black[0])
return dp[0][0];
else
return min(dp[0][0], dp[0][1]);
}
void input(){
init();
rd(n); rd(black_num);
ll d;
for(int i = 1, u, v; i < n; i++)
{
rd(u); rd(v); rd(d);
add(u, v, d);
add(v, u, d);
}
memset(black, 0, sizeof black);
while(black_num--)
{
int u; rd(u);
black[u] = 1;
}
}
int main(){
int T; rd(T);
while(T--){
input();
pt(solve()); putchar('\n');
}
return 0;
}
/*
99
16 5
0 1 1
1 2 6
1 3 100
2 4 3
2 5 1
4 12 1
4 6 1
5 8 1
8 13 3
8 15 4
5 7 1
14 7 1
3 9 1
9 10 1
9 11 1
1 3 4 13 15 9 5
0 1 1
0 2 2
2 6 6
1 3 3
1 4 4
1 5 5
4 7 2
1 8 4
8
3
5
6
7 2 2
0 1 1000
1 0 1 0
1 1
1
2 1
0 1 1000
0 5 2
0 1 5
1 2 3
2 3 4
3 4 5
0 4
5 3
0 1 5
1 2 3
2 3 4
3 4 5
0 4 2
5 4
0 1 5
1 2 3
2 3 4
3 4 5
0 4 2 3
5 5
0 1 5
1 2 3
2 3 4
3 4 5
0 1 2 3 4 11 6
0 1 10
0 2 9
0 3 8
0 4 7
1 5 4
2 6 5
3 7 1
3 10 2
3 9 3
4 8 6
5 6 7 9 8 10 ans:
107
10
1000
0
0
0
3
7
12
17 */

HDU 4313 Matrix 树形dp的更多相关文章

  1. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  3. hdu 6201 【树形dp||SPFA最长路】

    http://acm.hdu.edu.cn/showproblem.php?pid=6201 n个城市都在卖一种书,该书的价格在i城市为cost[i],商人打算从某个城市出发到另一个城市结束,途中可以 ...

  4. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  5. hdu 4081 最小生成树+树形dp

    思路:直接先求一下最小生成树,然后用树形dp来求最优值.也就是两遍dfs. #include<iostream> #include<algorithm> #include< ...

  6. HDU 3899 简单树形DP

    题意:一棵树,给出每个点的权值和每条边的长度, 点j到点i的代价为点j的权值乘以连接i和j的边的长度.求点x使得所有点到点x的代价最小,输出 虽然还是不太懂树形DP是什么意思,先把代码贴出来把. 这道 ...

  7. HDU 4714 Tree2cycle (树形DP)

    题意:给定一棵树,断开一条边或者接上一条边都要花费 1,问你花费最少把这棵树就成一个环. 析:树形DP,想一想,要想把一棵树变成一个环,那么就要把一些枝枝叶叶都换掉,对于一个分叉是大于等于2的我们一定 ...

  8. hdu Anniversary party 树形DP,点带有值。求MAX

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. HDU - 2196(树形DP)

    题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...

随机推荐

  1. Android Warning not all local changes may be shown due to an error

    idea使用svn出现Warning not all local changes may be shown due to an error,如下图所示: 解决方案: 1.File > Setti ...

  2. WSDL文档框架

  3. Flask项目之手机端租房网站的实战开发(二)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  4. GPUImage ==> 一个基于GPU图像和视频处理的开源iOS框架

    Logo 项目介绍: GPUImage是Brad Larson在github托管的开源项目. GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机 ...

  5. ZOJ 2421 Recaman's Sequence

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1421 题目大意: 定义a^m为 a^m = a^(m-1) - m  如果a^ ...

  6. 巴什博奕小结 HDU2188 HDU1846 HDU2149

    摘自百度百科: 巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以, ...

  7. php实现变态跳台阶(记忆化递归)

    php实现变态跳台阶(记忆化递归) 一.总结 1.本题思路(分类讨论思路,注意初始值和边界值):第一步如果1,那剩下的就是jumpFloorII($number-1)(下面jumpFloorII以j表 ...

  8. HTML/CSS 选择符优先级

    CSS的选择符优先级 1.同级样式默认后者覆盖前者 2.样式优先级 类型(1) < class[type](10)=伪类(10) < id(100) < style行间样式(1000 ...

  9. 关于JavaScript对象概念的总结

    原文 https://www.jianshu.com/p/88213b499c4b 大纲 前言 1.对象的相关概念 2.对象的创建(简单创建) 3.对象的属性 3.1.数据属性 3.2.访问器属性 4 ...

  10. 【u106】3D模型

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 一座城市建立在规则的n×m网格上,并且网格均由1×1正方形构成.在每个网格上都可以有一个建筑,建筑由若 ...