比赛 NOIP模拟赛by mzx Day1 评测结果 AAAATTTTTT
题目名称 零食店 最终得分 40
用户昵称 destiny 运行时间 6.006 s
代码语言 C++ 内存使用 0.87 MiB
提交时间 2016-10-19 21:46:15
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn=110;
struct Edge
{
	LL next,to,dis;
}e[maxn*maxn*2];
LL head[maxn],v[maxn],len,m,n,q,mv,mdis,tot;
bool flag[maxn];
void Insert(LL,LL,LL);
void Dfs(LL,LL,LL);
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	memset(head,-1,sizeof(head));
	scanf("%lld%lld%lld",&n,&m,&q);
	for(int i=1;i<=n;i++)scanf("%lld",&v[i]);
	for(int i=1;i<=m;i++)
	{
		LL x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
		Insert(x,y,z);Insert(y,x,z);
	}
	for(int i=1;i<=q;i++)
	{
		memset(flag,0,sizeof(flag));tot=0;
		LL st;scanf("%lld%lld%lld",&st,&mv,&mdis);
		Dfs(st,0,0);LL ans=0;
		for(int i=1;i<=n;i++)if(flag[i])ans++;
		printf("%lld\n",ans-1);
	}
	fclose(stdin);
	fclose(stdout);
	//system("pause");
	return 0;
}
void Insert(LL x,LL y,LL z)
{
	len++;e[len].to=y;e[len].next=head[x];
	head[x]=len;e[len].dis=z;
}
void Dfs(LL x,LL a,LL b)
{
	if(a>mv||b>mdis)return;
	if(tot==n)return;
	if(!flag[x]){flag[x]=1;tot++;}//printf("%d\n",x);//system("pause");
	for(int i=head[x];i!=-1;i=e[i].next)
	{
		int j=e[i].to;
		if(e[i].dis+b<=mdis)
		{
			if(v[j]<=mv)Dfs(j,max(a,v[j]),e[i].dis+b);
			else 
			{
				if(!flag[j])tot++;
				flag[j]=1;
			}
		}
	}
}
/*
5 5 2
1 2 3 4 5
1 2 1
1 3 4
2 3 2
1 4 3
2 5 1
1 3 5
*/