比赛 |
NOIP模拟赛by mzx Day1 |
评测结果 |
WAAAWWWTTT |
题目名称 |
零食店 |
最终得分 |
30 |
用户昵称 |
Rapiz |
运行时间 |
3.115 s |
代码语言 |
C++ |
内存使用 |
4.17 MiB |
提交时间 |
2016-10-19 21:50:59 |
显示代码纯文本
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#define file(x) "snackstore."#x
using std::min;
using std::sort;
using std::queue;
const int MAXN=110,MAXQ=1000010;
struct QY{
int c,d,id;
QY(int ic,int idis,int iid):c(ic),d(idis),id(iid){}
};
int n,m,q,dis[MAXN][MAXN],v[MAXN],sd[MAXN],ans[MAXQ];
bool inq[MAXN];
std::vector<QY> qu[MAXN];
bool cmp(const QY& a,const QY& b){
return a.c<b.c;
}
queue<int> que;
void solve(int s){
memset(sd,0x3f,sizeof(sd));
sd[s]=0;
for(int k=0;k<qu[s].size();k++){
int c=qu[s][k].c,d=qu[s][k].d,id=qu[s][k].id;
que.push(s);
while(!que.empty()){
int u=que.front();que.pop();
inq[u]=0;
for(int i=1;i<=n;i++) if(v[i]<=c&&sd[u]+dis[u][i]<sd[i]){
sd[i]=sd[u]+dis[u][i];
if(!inq[i]) inq[i]=1,que.push(i);
}
}
for(int i=1;i<=n;i++) if(i!=s) {
if(sd[i]<=d) ans[id]++;
else if(dis[s][i]<=d) ans[id]++;
}
}
}
int main(){
freopen(file(in),"r",stdin);
freopen(file(out),"w",stdout);
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=m;i++){
int u,v,t;
scanf("%d%d%d",&u,&v,&t);
dis[u][v]=dis[v][u]=min(dis[u][v],t);
}
for(int i=1;i<=q;i++){
int s,c,d;
scanf("%d%d%d",&s,&c,&d);
qu[s].push_back(QY(c,d,i));
}
for(int i=1;i<=n;i++) {
sort(qu[i].begin(),qu[i].end(),cmp);
solve(i);
}
for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
}