ZSTU 4248 KI的目标(dfs)
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)的更多相关文章
- zstu.4191: 无向图找环(dfs树 + 邻接表)
4191: 无向图找环 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 117 Solved: 34 Description 给你一副无向图,每条边有 ...
- 数位DP入门题
站点一览: hdu 2089"不要62" hdu 4734"F(X)" poj 3252"Round Numbers" hdu 3709&q ...
- P4160 [SCOI2009]生日快乐
题目描述 windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕. 现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕. win ...
- HDU 1242 dFS 找目标最短路
//多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚 #include<iostream> #include<cstring> usi ...
- Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)
Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum) 深度优先搜索的解题详细介绍,点击 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- BFS/DFS算法介绍与实现(转)
广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDFS读写数据块--${dfs.data.dir}选择策略
最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要 ...
随机推荐
- Benelux Algorithm Programming Contest 2014 Final
// Button Bashing (bfs) 1 #include <iostream> #include <cstdio> #include <cstring> ...
- CodeForces 781E Andryusha and Nervous Barriers 线段树 扫描线
题意: 有一个\(h \times w\)的矩形,其中有\(n\)个水平的障碍.从上往下扔一个小球,遇到障碍后会分裂成两个,分别从障碍的两边继续往下落. 如果从太高的地方落下来,障碍会消失. 问从每一 ...
- HDU 5739 Fantasia 双连通分量 树形DP
题意: 给出一个无向图,每个顶点有一个权值\(w\),一个连通分量的权值为各个顶点的权值的乘积,一个图的权值为所有连通分量权值之和. 设删除顶点\(i\)后的图\(G_i\)的权值为\(z_i\),求 ...
- python中pip 出错
错误:error in launcher: Unable to create process using '" python多个版本时出现, 解决方法-- 将pip重新安装 python3 ...
- java多线程安全的问题
多线程中一定会遇到线程安全的问题,也就是在同一时间N条线程操作了同一变量,这个变量也叫做共享变量. 举例:(错误的示范) 设计一个投票系统,多个人可以对同一个的票数进行投票,下面看具体代码: 代码: ...
- 63、加速android应用(转载)
本文转自 http://www.devtf.cn/?p=1097 原文链接 : Speed up your app原文作者 : UDI COHEN译文出自 : 开发技术前线 www.devtf.cn. ...
- github readme.md 添加图片
简要: 将图片放在仓库里面,在文件里链接它,最后 push 到 github 上. github 图片链接格式: (http://github.com/yourname/your-repository ...
- Android 使用剪贴板传递简单数据及复杂数据的方法
传递数据的场景在于不同页面之间跳转,需要携带数据:简单数据值指的是String, int等数据, 复杂数据指的是类 1. 使用剪贴板传递简单数据方法: 第一个页面里面放数据操作如下: Clipbo ...
- python学习_运算
1.数据类型 1.1数字 整型int,如2 浮点型float,如3.14和314E-2 复数complex,如(-5+4) 1.2布尔值 真或假 1或0 1.3字符串 'hello world' 2. ...
- Windows 7中安装SQL2005提示IIS未安装 解决办法 .(转载)
在Windows 7系统中安装SQL Server 2005时,可能会收到一个警告:提示IIS未安装或者未启用.在通过“控制面板”的“打开或关闭Windows功能”按默认设置安装IIS后,发现仍有这个 ...