比赛 NOIP模拟赛by mzx Day1 评测结果 WAAWWWWTTT
题目名称 零食店 最终得分 20
用户昵称 Ostmbh 运行时间 3.044 s
代码语言 C++ 内存使用 0.36 MiB
提交时间 2016-10-19 21:37:13
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int w[110][110];
vector<int>A[110];
int vis[110];
int dis[110];
int ins[110];
int cl[110];
queue<int>q;
inline void read(int &x){
	x=0;
	char c=getchar();
	bool flag=0;
	while(c<'0'||c>'9'){
		if(c=='-')
			flag=1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+c-'0';
		c=getchar();
	}
	if(flag)
		x=-x;
}
int main(){
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	int n,m,Q;
	read(n),read(m),read(Q);
	for(int i=1;i<=n;i++)
		read(cl[i]);
	memset(w,127/2,sizeof(w));
	int x,y,z;
	for(int i=1;i<=m;i++){
		read(x),read(y),read(z);
		w[x][y]=w[y][x]=min(w[x][y],z);
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<i;j++)
			if(w[i][j]!=w[0][0])
				A[i].push_back(j),A[j].push_back(i);
	for(int i=1;i<=Q;i++){
		read(x),read(y),read(z);
		for(int j=1;j<=n;j++)
			vis[j]=ins[j]=0,dis[j]=0x7fffffff/2;
		dis[x]=0;
		vis[x]=1;
		q.push(x);
		while(!q.empty()){
			int cd=q.front();
			ins[cd]=1;
			q.pop();
			for(int j=0;j<A[cd].size();j++){
				int u=A[cd][j];
				if(dis[u]>dis[cd]+w[cd][u]&&dis[cd]+w[cd][u]<=z){
					if(cl[u]>y){
						ins[u]=1;
						continue;
					}
					else if(!vis[u]&&cl[u]<=y){
						vis[u]=1;
						q.push(u);
					}
				}
			}
			vis[cd]=0;
		}
		int ans=0;
		for(int j=1;j<=n;j++)
			if(ins[j]&&j!=x)
				ans++;
		printf("%d\n",ans);
	}
return 0;
}