记录编号 |
326999 |
评测结果 |
AAAAAAATTT |
题目名称 |
零食店 |
最终得分 |
70 |
用户昵称 |
gls1196 |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
3.413 s |
提交时间 |
2016-10-21 18:51:12 |
内存使用 |
9.15 MiB |
显示代码纯文本
/*
D1T2 :类似于过路费,按照点权排序跑Floyed,dis[k][i][j] 表示经过前k小的点,i'j的最短距离。
最后求答案二分得到最多能走前k各点,再次二分距离。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=105;
ll n,m,q,dis[maxn][maxn][maxn],val[maxn],id[maxn];
bool Cmp(const ll &x,const ll &y){
return val[x]<val[y];
}
void Floyed(){
memset(dis,0x1f,sizeof(dis));
scanf("%lld%lld%lld",&n,&m,&q);ll u,v,w;
for(int i=1;i<=n;i++)id[i]=i,scanf("%lld",&val[i]);
sort(id+1,id+n+1,Cmp);
while(m--){
scanf("%lld%lld%lld",&u,&v,&w);
dis[0][u][v]=dis[0][v][u]=min(dis[0][u][v],w);
}
for(int i=1;i<=n;i++)dis[0][i][i]=0;
for(int k=1;k<=n;k++){
memcpy(dis[k],dis[k-1],sizeof(dis[k-1]));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[k][i][j]=min(dis[k][i][j],dis[k][i][id[k]]+dis[k][id[k]][j]);
}
for(int k=0;k<=n;k++)
for(int i=1;i<=n;i++)
sort(dis[k][i]+1,dis[k][i]+n+1);
sort(val+1,val+n+1);
}
void Query(){ll u,v,d;
while(q--){
scanf("%lld%lld%lld",&u,&v,&d);
ll p=upper_bound(val+1,val+n+1,v)-val-1;
ll ans=upper_bound(dis[p][u]+1,dis[p][u]+n+1,d)-dis[p][u]-1;
printf("%lld\n",--ans);
}
}
int main(){
freopen("snackstore.in","r",stdin);
freopen("snackstore.out","w",stdout);
Floyed();Query();return 0;
}