比赛 防止浮躁的小练习v0.7 评测结果 AAAAAAATTT
题目名称 零食店 最终得分 70
用户昵称 Lethur 运行时间 3.506 s
代码语言 C++ 内存使用 0.55 MiB
提交时间 2016-10-27 21:58:38
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cctype>
#include<vector>
#include<queue>
#define MAXN 101
#define INF 0x3f3f3f3f
using namespace std;
int n,m,q;
int v[MAXN]={0};
int f[MAXN*MAXN*2]={0};
int t[MAXN*MAXN*2]={0};
int w[MAXN*MAXN*2]={0};
int cnt=0;
vector<int>edge[MAXN];
template<typename T>inline T read(T &x)
{
	int f=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar())
	if(ch=='-')
	f=-1;
	for(x=0;isdigit(ch);ch=getchar())
	x=10*x+ch-'0';
	return x*=f;
}
template<typename T>inline void write(T x)
{
	if(x==0)
	{
		putchar('0');
		return ;
	}
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	int top=0;
	static char s[20];
	for(;x;x/=10)
	{
		s[++top]=x%10+'0';
	}
	while(top)
	{
		putchar(s[--top]);
	}
	return ;
}
inline int spfa(int s,int c,int d)
{
	queue<int>Q;
	int dis[MAXN]={0};
	for(int i=1;i<=n;i++)
	{
		dis[i]=INF;
	}
	dis[s]=0;
	Q.push(s);
	while(!Q.empty())
	{
		int u=Q.front();
		Q.pop();
		if(v[u]>c&&u!=s)
		continue;
		for(int i=0;i<edge[u].size();i++)
		{
			int& e=edge[u][i];
			if(dis[t[e]]>dis[u]+w[e])
			{
				dis[t[e]]=dis[u]+w[e];
				Q.push(t[e]);
			}
		}
	}
	int ans=0;
	/*for(int i=1;i<=n;i++)
	{
		if(i!=s)
		cout<<s<<"到"<<i<<"的距离为 "<<dis[i]<<endl; 
	}*/
	for(int i=1;i<=n;i++)
	{
		if(dis[i]<=d&&i!=s)
		{
			ans++;
			//cout<<"可到达的零食店: "<<i<<endl;
		}
	}
	return ans;
}
inline void Add(int u,int v,int w1)
{
	edge[u].push_back(cnt);
	f[cnt]=u;
	t[cnt]=v;
	w[cnt]=w1;
	cnt++;
	return ;
}
int main()
{
	ios::sync_with_stdio(false);
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	read(n);
	read(m);
	read(q);
	for(int i=1;i<=n;i++)
	{
		read(v[i]);
	}
	for(int i=1;i<=m;i++)
	{
		int u,v,l;
		read(u);
		read(v);
		read(l);
		Add(u,v,l);
		Add(v,u,l);
	}
	for(int i=1;i<=q;i++)
	{
		int s,c,d;
		read(s);
		read(c);
		read(d);
		int ans=spfa(s,c,d);
		cout<<ans<<endl;
	}
	return 0;
}