比赛 NOIP模拟赛by mzx Day1 评测结果 AAAATTTTTT
题目名称 零食店 最终得分 40
用户昵称 抽空的太阳 运行时间 6.031 s
代码语言 C++ 内存使用 25.11 MiB
提交时间 2016-10-19 20:59:04
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1000010;
const int inf=0x7fffffff;
int n,m,k,tot,a[maxn],dis[maxn],head[maxn];
bool flag[maxn],can[maxn];
queue<int> q;
struct node
{
	int to;
	int w;
	int next;
}e[maxn];
int init()
{
	int f=1,x=0;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return f*x;
}
void add_edge(int u,int v,int w)
{
	
	e[++tot].to=v;
	e[tot].w=w;
	e[tot].next=head[u];
	head[u]=tot;
}
int spfa(int s,int c,int d)
{
	while(!q.empty()) q.pop();
	memset(flag,0,sizeof(flag));
	memset(can,0,sizeof(can));
	for(int i=1;i<=n;i++)
	dis[i]=inf;dis[s]=0;
	q.push(s);flag[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();flag[u]=0;
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].to;
			if(a[v]<=c)
			{
				if(dis[v]>dis[u]+e[i].w&&dis[u]+e[i].w<=d)
				{
					dis[v]=dis[u]+e[i].w;
					can[v]=1;
					if(!flag[v])
					{
						q.push(v);
						flag[v]=1;
					}
				}
			}
			else if(a[v]>c&&dis[u]+e[i].w<=d) can[v]=1;
		}
	}
	int tmp=0;
	for(int i=1;i<=n;i++)
	if(can[i]&&i!=s) tmp++;
	return tmp;
}
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	int x,y,z;
	n=init(),m=init(),k=init();
	for(int i=1;i<=n;i++)
	a[i]=init();
	for(int i=1;i<=m;i++)
	{
		x=init(),y=init(),z=init();
		add_edge(x,y,z);
		add_edge(y,x,z);
	}
	for(int i=1;i<=k;i++)
	{
		x=init(),y=init(),z=init();//起点 消费限制 路程限制 
		printf("%d\n",spfa(x,y,z));
	}
	return 0;
}