比赛 |
NOIP模拟赛by mzx Day1 |
评测结果 |
TTTTTTTTTT |
题目名称 |
零食店 |
最终得分 |
0 |
用户昵称 |
Marvolo |
运行时间 |
10.032 s |
代码语言 |
C++ |
内存使用 |
5.42 MiB |
提交时间 |
2016-10-19 21:59:54 |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,q,be,ans=0,x,y,Z,root,i,j,Q,cost,dmax,Ra,ss=0;
int dis[110][110][110];
int ld[110][110],z[110],dq[110];
bool bh[110][110],v[110];
vector <int> l[110],l2[110];
struct Marvolo{
int a,b;
}s[110];
inline int read(){
int p=0,c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9') p=p*10+c-48,c=getchar();
return p;
}
inline int min(int a,int b){return (a<b)?a:b;}
inline bool cmp(const Marvolo x,const Marvolo y){return x.a<y.a;}
inline void Add(int qd,int Rank){
int i=0,t=1,w=0,x=0;
bh[root][qd]=1;
for (i=1;i<=n;i++) dis[root][Rank][i]=dis[root][Rank-1][i];
for (i=0;i<l[qd].size();i++)
if (dis[root][Rank][qd]>dis[root][Rank][l[qd][i]]+l2[qd][i]&&bh[root][l[qd][i]]){
dis[root][Rank][qd]=dis[root][Rank][l[qd][i]]+l2[qd][i];
}
memset(z,0,sizeof(z)); memset(v,0,sizeof(v));
z[1]=qd; v[qd]=1;
while (w!=t){
w=(w+1)%n; x=z[w]; v[x]=0;
for (i=0;i<l[x].size();i++)
if (dis[root][Rank][x]+l2[x][i]<dis[root][Rank][l[x][i]]&&l[x][i]!=root){
dis[root][Rank][l[x][i]]=dis[root][Rank][x]+l2[x][i];
if (!v[l[x][i]]){
if (dq[l[x][i]]>dq[x]) continue;
v[l[x][i]]=1; t=(t+1)%n; z[t]=l[x][i];
}
}
}
}
int main(){
freopen("zht.in","r",stdin);
freopen("zht.out","w",stdout);
n=read(); m=read(); q=read();
for (i=1;i<=n;i++) s[i].a=read(),s[i].b=i,dq[i]=s[i].a;
memset(ld,0x3f3f3f3f,sizeof(ld));
for (i=1;i<=m;i++){
x=read(); y=read(); Z=read();
if (x==y) continue;
ld[x][y]=min(ld[x][y],Z);
if (ld[x][y]!=Z) continue;
l[x].push_back(y); l[y].push_back(x);
l2[x].push_back(Z); l2[y].push_back(Z);
}
sort(s+1,s+1+n,cmp); memset(dis,0x3f3f3f3f,sizeof(dis));
for (i=1;i<=n;i++){
root=i; bh[root][i]=1; ss=1; dis[root][1][root]=0;
for (j=0;j<l[i].size();j++)
dis[root][1][l[i][j]]=l2[i][j];
for (j=1;j<=n;j++)
if (s[j].b!=i) Add(s[j].b,++ss);
}
while (q--){
Q=read(); cost=read(); dmax=read(); ans=0; Ra=n;
for (i=1;i<=n;i++) if (cost<s[i].a) {Ra=i-1; break;}
for (i=1;i<=n;i++){
if (i==Q) continue;
if (dis[Q][Ra][i]<=dmax) ans++;
}
printf("%d\n",ans);
}
return 0;
}