Help
  • 板块灌水区
  • 楼主Hoks
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/5/1 07:47
  • 上次更新2023/10/28 02:31:55
查看原帖
Help
551100
Hoks楼主2022/5/1 07:47

有一棵含有 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

2022/5/1 07:47
加载中...