记录编号 326999 评测结果 AAAAAAATTT
题目名称 零食店 最终得分 70
用户昵称 Gravatargls1196 是否通过 未通过
代码语言 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;
}