比赛 NOIP模拟赛by mzx Day1 评测结果 AAAAEEEEEE
题目名称 零食店 最终得分 40
用户昵称 旺仔小馒头 运行时间 0.959 s
代码语言 C++ 内存使用 9.42 MiB
提交时间 2016-10-19 21:37:44
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#define pa pair<ll,int>
#define mk make_pair
#define maxn 110
#define maxm 10010
#define ll long long
using namespace std;
int n,m,Q,num,head[maxn],c[maxn],r[maxn],sum;
ll dis[maxn],f[maxn][maxn][maxn];
bool vis[maxn];
struct node{
	int v,t,pre;
}e[maxn*2];
priority_queue<pa,vector<pa>,greater<pa> >q;
int init(){
	int x=0,f=1;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
	return x*f;
}
void Add(int from,int to,int dis){
	num++;e[num].v=to;
	e[num].t=dis;
	e[num].pre=head[from];
	head[from]=num;
}
void Dij(int s,int mx){
	while(!q.empty())q.pop();
	memset(dis,127/3,sizeof(dis));
	memset(vis,0,sizeof(vis));
	q.push(mk(0,s));dis[s]=0;
	while(!q.empty()){
		int k=q.top().second;
		q.pop();
		if(vis[k]||(c[k]>mx&&k!=s))continue;vis[k]=1;
		for(int i=head[k];i;i=e[i].pre){
			int v=e[i].v;
			if(dis[v]>dis[k]+e[i].t){
				dis[v]=dis[k]+e[i].t;
				q.push(mk(dis[v],v));
			}
		}
	}
	for(int i=1;i<=n;i++)
		f[s][i][mx]=dis[i];
}
void Solve(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=sum;j++)
			Dij(i,j);
}
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	n=init();m=init();Q=init();
	int u,v,t;
	for(int i=1;i<=n;i++){
		c[i]=init();r[++sum]=c[i];
	}
	sort(r+1,r+1+sum);
	sum=unique(r+1,r+1+sum)-r-1;
	for(int i=1;i<=n;i++){
		int pos=lower_bound(r+1,r+1+sum,c[i])-r;
		c[i]=pos;
	}
	for(int i=1;i<=m;i++){
		u=init();v=init();t=init();
		Add(u,v,t);Add(v,u,t);
	}
	memset(f,127/3,sizeof(f));Solve();
	while(Q--){
		int cnt=0;
		u=init();v=init();t=init();
		v=upper_bound(r+1,r+1+sum,v)-r-1;
		for(int i=1;i<=n;i++)
			if(f[u][i][v]<=t&&i!=u)cnt++;
		printf("%d\n",cnt);
	}
	return 0;
}