比赛 NOIP模拟赛by mzx Day1 评测结果 AAAAWWWTTT
题目名称 零食店 最终得分 40
用户昵称 nancheng58 运行时间 3.175 s
代码语言 C++ 内存使用 0.93 MiB
提交时间 2016-10-19 20:53:00
显示代码纯文本
#include<iostream>
#include<cstdio>
#define MAXN 101
#define MAXM 10001
using namespace std;
int u,v,n,m,k,tot,dis[MAXN],w[MAXN],cut,q[MAXM*10],head1,tail,head[MAXN];
bool b[MAXN];
struct data{int v,next,x;}e[MAXM*2];
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
	return x*f;
}
void add(int u,int v,int z)
{
	e[++cut].v=v;
	e[cut].next=head[u];
	e[cut].x=z;
	head[u]=cut;
}
int spfa(int s,int l,int limi)
{
	head1=tail=1;
	for(int i=1;i<=n;i++) dis[i]=1e9,b[i]=false;
	q[1]=s;dis[s]=0;
	while(head1<=tail)
	{
		u=q[head1++];b[u]=false;
		for(int i=head[u];i;i=e[i].next)
		{
			v=e[i].v;
			if(dis[u]+e[i].x>l) continue;
			if(dis[v]>dis[u]+e[i].x)
			{
				dis[v]=dis[u]+e[i].x;
				if(!b[v]&&w[v]<=limi) b[v]=true,q[++tail]=v;
			}
		}
	}
	tot=0;
	for(int i=1;i<=n;i++)
	 if(dis[i]<=l) tot++;
	return tot-1;
}
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	int x,y,z;
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++) w[i]=read();
	for(int i=1;i<=m;i++)
	{
		x=read(),y=read(),z=read(),
	  	add(x,y,z),add(y,x,z);
	}
	while(k--)
	{
		x=read(),z=read(),y=read();
		printf("%d\n",spfa(x,y,z));
	}
	return 0;
}