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