比赛 NOIP模拟赛by mzx Day1 评测结果 AAAAAAATTT
题目名称 零食店 最终得分 70
用户昵称 L_in 运行时间 3.425 s
代码语言 C++ 内存使用 0.44 MiB
提交时间 2016-10-19 21:39:53
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 110
#define maxe 10010
using namespace std;
typedef long long LL;
int n,m,q,ans;
int c[maxn];
LL dis[maxn]; 
struct Point{
	int id;
	LL dis;
	Point(int x,LL y){id=x;dis=y;}
	bool operator<(const Point&x)const{
		return dis>x.dis;
	}
};
struct Edge{
	int to,next,w;
}e[maxe<<1];
int head[maxn],tot;
void Add(int from,int to,int w)
{	
	e[++tot].to=to;
	e[tot].w=w;
	e[tot].next=head[from];
	head[from]=tot;
}
void Djs(int s,int maxc,int maxd)
{
	ans=0;
	priority_queue<Point> q;
	q.push(Point(s,0));
	memset(dis,0x7f,sizeof(dis));
	dis[s]=0;
	while(!q.empty()){
		Point p=q.top();q.pop();
		int x=p.id;
		if(dis[x]!=p.dis)continue;
		if(x!=s&&c[x]>maxc){ans++;continue;}
		if(x!=s)ans++;
		for(int i=head[x];i;i=e[i].next){
			int to=e[i].to;
			if(dis[to]>dis[x]+e[i].w&&dis[x]+e[i].w<=maxd){
				dis[to]=dis[x]+e[i].w;
				q.push(Point(to,dis[to]));
			}
		}
	}	
}
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++)scanf("%d",&c[i]);
	int x,y,w;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&w);
		Add(x,y,w);Add(y,x,w);
	}
	int s,mc;LL md;
	for(int i=1;i<=q;i++){
		scanf("%d%d%lld",&s,&mc,&md);
		Djs(s,mc,md);
		printf("%d\n",ans);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}