1 条题解
-
-2
GCOJ Official (Cui2010) LV 8 MOD @ 3 年前
题目不难,模拟即可。
文件操作请自行删除。
- 1
信息
- ID
- 1017
- 难度
- 6
- 分类
- (无)
- 标签
- 递交数
- 3
- 已通过
- 3
- 通过率
- 100%
- 被复制
- 1
- 上传者
题目不难,模拟即可。
文件操作请自行删除。
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > gv[100001];
int sm[100001];
// Add an edge of length n between u and v.
void add_edge(int u, int v, int n){
gv[u].push_back(make_pair(v, n));
gv[v].push_back(make_pair(u, n));
}
// Calculates The smallest length of the path from i to the root.
void dfs(int n, int fa){
for(int i = 0;i < gv[n].size();i++){
if(gv[n][i].first == fa){
continue;
}
sm[gv[n][i].first] = min(sm[n], gv[n][i].second);
dfs(gv[n][i].first, n);
}
}
int main(){
freopen("mootube.in", "r", stdin);
freopen("mootube.out", "w", stdout);
int n, q;
cin >> n >> q;
for(int i = 0;i < n - 1;i++){
int u, v, x;
cin >> u >> v >> x;
add_edge(u, v, x);
}
for(int i = 0;i < q;i++){
int k, v;
cin >> k >> v;
memset(sm, 0x3f3f3f3f, sizeof(sm));
dfs(v, -1);
sm[v] = 0;
int ans = 0;
for(int j = 1;j <= n;j++){
if(sm[j] >= k){
ans++;
}
}
cout << ans << endl;
}
fclose(stdin), fclose(stdout);
return 0;
}