KI的目标

Time Limit: 2 Sec  Memory Limit: 128 MB
                                                                      Submit: 308  Solved: 77

Description

KI给自己制定了最近制定了一些学习目标,因为有些大目标的达到要先完成一些小目标,所以KI就下意识的把这些目标连成了一棵树,以1号目标为根。

KI是个很谨慎的人,于是他请他的朋友们对这棵树上的每条边评估了一个努力值cost(i),并对每个目标评估了一个

价值val(i)。

然后KI决定去掉树上的一些不可行的目标,他判断的依据是:

假设目标v属于以u为根的子树,如果dis(u,v)<val(u)-val(v),那么以v为根的整棵子树都会被去掉。(dis(u,v)从节点u到节点v所有边的边权和)

请帮KI计算一下最后他还剩下几个目标。

Input

第一行有个整数T, 表示测试组数。T≦101。

接下来每个测试组,第一行给出一个数n, 表示当前这棵树的节点数。

接下来n-1行,每行有两个数x y cost:表示x个节点和y节点间有条边, 这条边的努力值为cost。

接下来一行,有n个数,第i个数表示val(i)。

1 <= x,y <= n <= 100000, -1e9 <= try(i),val(i) <= 1e9

Output

对于每个测试组,把对应的答案在一行中输出。

Sample Input

1
6
1 2 1
2 3 5
2 4 -10
1 5 3
5 6 4
6 5 4 5 3 6

Sample Output

5

HINT

Source

假设目标v属于以u为根的子树,如果dis(u,v)<val(u)-val(v),那么以v为根的整棵子树都会被去掉。

我们假设$dist(n)$为从$1$号根节点出发走到$n$号节点时经过的边的边权总和。

那么,要使$dis(u,v)<val(u)-val(v)$,

则$dist(v)-dist(u)<val(u)-val(v)$,

即$dist(v)+val(v)<dist(u)+val(u)$.

那么就很明显了,跑一遍DFS计算出$dist(i)+val(i)$再根据题目信息更新答案即可。

#include <bits/stdc++.h>

using namespace std;

#define rep(i,a,b)      for(int i(a); i <= (b); ++i)
#define for_edge(i,x) for(int i = H[x]; i; i = X[i])
#define LL long long const int N = 100010; int E[N << 1], H[N << 1], X[N << 1], vis[N], f[N], fa[N], fl[N];
int x, y, T, n, et, ans;
LL V[N << 1], a[N], c[N], dist[N], val; inline void addedge(int a, int b, LL c){
E[++et] = b, X[et] = H[a], H[a] = et, V[et] = c;
E[++et] = a, X[et] = H[b], H[b] = et, V[et] = c;
} void dfs(int x, LL num){
vis[x] = 1; dist[x] = num;
for_edge(i, x){
int v = E[i];
if (!vis[v]){
fa[v] = x;
dfs(v, num + V[i]);
}
}
} void work(int x){
vis[x] = 1; fl[x] = 0;
for_edge(i, x){
int v = E[i];
if (v != fa[x]){ if (!vis[v]) work(v); }
}
} int main(){ scanf("%d", &T);
while (T--){
scanf("%d", &n);
et = 0;
memset(H, 0, sizeof H);
rep(i, 1, n - 1){
scanf("%d%d%lld", &x, &y, &val);
addedge(x, y, val);
} rep(i, 1, n) scanf("%lld", a + i);
memset(vis, 0, sizeof vis); dfs(1, 0);
rep(i, 1, n) c[i] = a[i] + dist[i], fl[i] = 1; memset(f, 0, sizeof f);
rep(i, 2, n) if (c[i] < c[fa[i]]) f[i] = 1; memset(vis, 0, sizeof vis);
rep(i, 1, n) if (f[i] && vis[i] == 0) work(i); ans = 0;
rep(i, 1, n) ans += fl[i];
printf("%d\n", ans); } return 0; }

ZSTU 4248 KI的目标(dfs)的更多相关文章

  1. zstu.4191: 无向图找环(dfs树 + 邻接表)

    4191: 无向图找环 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34 Description 给你一副无向图,每条边有 ...

  2. 数位DP入门题

    站点一览: hdu 2089"不要62" hdu 4734"F(X)" poj 3252"Round Numbers" hdu 3709&q ...

  3. P4160 [SCOI2009]生日快乐

    题目描述 windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕. 现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕. win ...

  4. HDU 1242 dFS 找目标最短路

    //多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚 #include<iostream> #include<cstring> usi ...

  5. Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)

    Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum) 深度优先搜索的解题详细介绍,点击 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在 ...

  6. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  7. BFS/DFS算法介绍与实现(转)

    广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...

  8. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. HDFS读写数据块--${dfs.data.dir}选择策略

    最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要 ...

随机推荐

  1. [Hdu3507]Print Article(斜率优化)

    Description 题意:给N个数,按顺序全部取走,每次取一段连续的区间,代价为\((S[i]-S[j])^2+M\) 其中M为一个给定的常数,\(S[i]\)为前缀和 \(N\leq 50000 ...

  2. Hive UDTF开发指南

    在这篇文章中,我们将深入了解用户定义表函数(UDTF),该函数的实现是通过继承org.apache.Hadoop.hive.ql.udf.generic.GenericUDTF这个抽象通用类,UDTF ...

  3. Unity 与Mono和.Net的关系

    一.分析 首先,我们要知道Unity,Mono,.Net 三者的关系.需要简单说一下.Net. .Net拥有跨语言,跨平台性. 跨语言:就是只要是面向.Net平台的编程语言,用其中一种语言编写的类型就 ...

  4. python django 路由系统

    URL配置                        基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views ...

  5. Windows Server 笔记(七):Windows Server 2012 R2 NIC Teaming(NIC组)

    什么是NIC Teaming?         NIC Teaming 就是将两个或更多的网络适配器组合在一起,从而达到容错和带宽聚合作用.NIC Teaming 中的每个网络适配器都是物理存在的(虚 ...

  6. 【Letter Combinations of a Phone Number】cpp

    题目: Given a digit string, return all possible letter combinations that the number could represent. A ...

  7. linux环境搭建系列之Apache MQ安装

    1.创建文件夹 #mkdir MQ 2.解压 #tar -vxf apache-activemq-5.14.3-bin.tar.gz 3.进入解压后的目录 # cd apache-activemq-5 ...

  8. thinkphp3.2接入支付宝支付接口(PC端)

    下载支付宝接口包    点击这里        提取密码:aryp 整个接口核心类文件 alipay.config.php是相关参数的配置文件 alipayapi.php 是支付宝接口入口文件 not ...

  9. [报错处理]Could not find a version that satisfies the requirement xml (from versions)

    安装xml库发生报错 pip3 install xml Collecting xml Could not find a version that satisfies the requirement x ...

  10. JVM虚拟机系列(三)Class文件格式