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