1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <bits/stdc++.h> using namespace std;
#define Combine Pair, greater<Pair>, pairing_heap_tag #define LL long long #define ll long long #define Pair pair<double,LL> #define ULL unsigned long long #define ls rt<<1 #define rs rt<<1|1 #define one first #define two second #define MS 1000009 #define INF 1e9 #define DBINF 1e100 #define Pi acos(-1.0) #define eps 1e-9 #define mod 1000000007 #define mod1 39989 #define mod2 1000000000
int n,m; int fa[MS]; int size[MS]; int ac[MS]; struct node{ int u,v,val; }p[MS]; struct nod{ int k,poi,pos; }a[MS];
int find(int x){ if(x == fa[x]) return x; else return fa[x] = find(fa[x]); }
void merge(int x,int y){ int fx = find(x); int fy = find(y); fa[fy] = fx; size[fx] += size[fy]; }
int main() { ios::sync_with_stdio(false); cin >> n >> m; for(int i=1;i<=n-1;i++){ cin >> p[i].u >> p[i].v >> p[i].val; if(p[i].u > p[i].v) swap(p[i].u,p[i].v); fa[i] = i; size[i] = 1; } size[n] = 1; fa[n] = n; sort(p+1,p+n+1,[](node t1,node t2){return t1.val > t2.val;}); for(int i=1;i<=m;i++){ cin >> a[i].k >> a[i].poi; a[i].pos = i; } sort(a+1,a+m+1,[](nod t1,nod t2){return t1.k > t2.k;}); int i=1,j=1; for(;i<=m;i++){ for(;j<=n && p[j].val>=a[i].k;j++){ merge(p[j].u,p[j].v); } ac[a[i].pos] = size[find(a[i].poi)] - 1; } for(int i=1;i<=m;i++){ cout << ac[i] << endl; } cout << endl; return 0; }
|