有一棵含有 N 个节点的树,有 N-1 条边,每条边有一个权值 W。给定 Q 个询问(Ki,Vi), 表示把树中边权小于 Ki 的边删除后,从 Vi 点还可以走到多少个顶点。每次操作都是独立的, 互不影响,即每次询问后,下次开始询问时,树又回到初始状态。 【输入格式】 第一行两个整数 N 和 Q。以下 N-1 行,描述 N-1 条边(xi,yi,wi),分别两个顶点编号和 边权。紧接着的 Q 行,每行两个数(Ki,Vi),如题意。 【输出格式】 对于 Q 个询问,输出查询结果。 【输入样例】 4 3 1 2 4 2 4 5 2 3 3 2 2 5 1 4 1 【输出样例】 302 【数据范围】 40%的数据,1<=N,Q<=200 对于 100%的数据,1<=N,Q<=5000,1<=Wi,Ki<=1e9
这是题目
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{int x,y,w;}a[5010];
int n,q,ans[5010];
vector<int> e[5010];
int mp[5010];
queue<int>p;
int read()
{
char c=getchar();int x=0;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
bool cmp(node x,node y)
{return x.w>y.w;}
signed main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read(),q=read();
for(int i=1;i<n;i++) a[i].x=read(),a[i].y=read(),a[i].w=read();
sort(a+1,a+n,cmp);
for(int k=1;k<=q;k++)
{
int x=read(),y=read();
memset(mp,0,sizeof mp);
for(int i=1;i<n;i++)
if(a[i].w<x) break;
else
{
e[a[i].x].push_back(a[i].y);
e[a[i].y].push_back(a[i].x);
}
p.push(y);
mp[y]=1;
while(!p.empty())
{
x=p.front();p.pop();
for(int i=1;i<=e[x].size();i++)
if(!mp[e[x][i]]&&e[x][i])
mp[e[x][i]]=1,p.push(e[x][i]),ans[k]++;
}
}
for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
return 0;
}
为什么我这串代码会运行错误?
显示了运行时错误:3221225477