HDU 4313 Matrix 树形dp
题意:
给定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的更多相关文章
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- hdu 6201 【树形dp||SPFA最长路】
http://acm.hdu.edu.cn/showproblem.php?pid=6201 n个城市都在卖一种书,该书的价格在i城市为cost[i],商人打算从某个城市出发到另一个城市结束,途中可以 ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
- hdu 4081 最小生成树+树形dp
思路:直接先求一下最小生成树,然后用树形dp来求最优值.也就是两遍dfs. #include<iostream> #include<algorithm> #include< ...
- HDU 3899 简单树形DP
题意:一棵树,给出每个点的权值和每条边的长度, 点j到点i的代价为点j的权值乘以连接i和j的边的长度.求点x使得所有点到点x的代价最小,输出 虽然还是不太懂树形DP是什么意思,先把代码贴出来把. 这道 ...
- HDU 4714 Tree2cycle (树形DP)
题意:给定一棵树,断开一条边或者接上一条边都要花费 1,问你花费最少把这棵树就成一个环. 析:树形DP,想一想,要想把一棵树变成一个环,那么就要把一些枝枝叶叶都换掉,对于一个分叉是大于等于2的我们一定 ...
- hdu Anniversary party 树形DP,点带有值。求MAX
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU - 2196(树形DP)
题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...
随机推荐
- js中#代表什么
js中#代表什么 一.总结 1.#号:代表id选择器 2. $('#div1'). : 常用用法,前面也有$符号 二."#"在js中代表什么 js里我不曾看到用到‘#’的代码端, ...
- 单位转换 inch mm mil
从上面看:英寸(inch)是最大的单位 其次是毫米(mm) 再次是密耳(mil)
- js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言
js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言 一.总结 一句话总结:实现按下组合键提交留言是通过给input加keydown事件,判断按键的键码来实现的. 1.如 ...
- JSONModel
JSONModel 一个解析 JSON 数据的开源库,可以将 JSON 数据直接解析成自定义的 model ,其中对数据类型的检查和对数据类型的转换比较贴心.最近在项目中使用了以后觉得确实方便很多,推 ...
- 杭电ACM1197——Specialized Four-Digit Numbers
题目的意思是从2992開始的四位数.每个四位数的10.12,16进制的数的每一位加起来都相等,就输出该数. 非常easy的一道题目. 以下的是AC的代码: #include <iostream& ...
- 3D 应用程序性能
原文:3D 应用程序性能 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/74595999 3 ...
- 【t041】距离之和
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在一条数轴上有N头牛在不同的位置上,每头牛都计算到其它各头牛的距离.求这n*(n-1)个距离的总和. ...
- vscode visual studio code svn 小乌龟 快捷键设置
首先要安装svn小乌龟 然后安装vs code的svn插件TortoiseSVN for VS Code 文件->首选项->键盘快捷方式->搜索svn->找到相应命令然后设置快 ...
- php压缩
php压缩的一个demo,随便测试了一下,可以用 <?php class PHPZip { private $ctrl_dir = array(); private $datasec = arr ...
- angular动画知识点以及代码样例
原文地址 https://www.jianshu.com/p/4400174072e2 大纲 1.angular动画的相关概念 2.angular动画的绑定方式 3.angular动画代码实例 1.a ...