比赛 |
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;
}