题意:

给定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. 关于python中矩阵的实现和矩阵的转置

    python中矩阵的实现是靠序列,,, 序列有很多形式, 其实矩阵是现实生活中的东西,把现实生活中的结构转换到程序中. 就需要有个实现的方法,而这种路径是多种多样的. 下面给出一个把矩阵转换成pyth ...

  2. (转) 设置sqlplus中的退格键

    转自:http://blog.itpub.net/26110315/viewspace-717249/ 有些时候当你使用sqlplus登录到数据库中的时候,敲错了命令想要删除修改的时候,发现以前敲入的 ...

  3. 11.5 Android显示系统框架_Vsync机制_代码分析

    5.5 surfaceflinger对vsync的处理buffer状态图画得不错:http://ju.outofmemory.cn/entry/146313 android设备可能连有多个显示器,AP ...

  4. UVA 11388 - GCD LCM 水~

    看题传送门 题目大意: 输入两个数G,L找出两个正整数a 和b,使得二者的最大公约数为G,最小公倍数为L,如果有多解,输出a<=b且a最小的解,无解则输出-1 思路: 方法一: 显然有G< ...

  5. Java反射学习总结三(静态代理)

    反射最常见的应用就是代理模式了. 本文先简单介绍一下代理模式,并写一个静态代理的例子.为下一篇重要的动态代理做点铺垫 代理模式的作用是: 为其他对象提供一种代理以控制对这个对象的访问. 另外在某些情况 ...

  6. stm32四种输入

    1.          上拉输入(GPIO_Mode_IPU)   上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0.1信号,读取此时的引脚电平为高电平:   2.       ...

  7. 又在折腾cygwin

    apt-cyg https://github.com/transcode-open/apt-cyg/blob/master/README.md cygwin 163镜像 http://mirrors. ...

  8. 嵌入式平台下的ldd

    x86平台有ldd可以很方便的查看对库的依赖关系,但在嵌入式linux环境中没有这个命令,替而代之是 CC=$(CROSS_COMPILE)gcc LDD=$(CROSS_COMPILE)readel ...

  9. Android bitmap绘制文字自动换行

    public Bitmap getNewBitMap(String text) { Bitmap newBitmap = Bitmap.createBitmap(,, Config.ARGB_4444 ...

  10. [TypeScript] Catch unsafe use of "this" in TypeScript functions

    this is probably the most tricky thing to use in JavaScript and therefore TypeScript. Fortunately th ...