比赛 NOIP模拟赛by mzx Day1 评测结果 WWAWWWWTTT
题目名称 零食店 最终得分 10
用户昵称 派特三石 运行时间 3.083 s
代码语言 C++ 内存使用 0.57 MiB
提交时间 2016-10-19 21:48:20
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define pa system("pause")
using namespace std;
const int maxn=110;
int n,m,q,head[maxn];
struct edge
{
	int to,dis,next;
}e[22000]; 
int ans=0,tot=0,len,dis,mon,f[maxn],v[maxn],st;bool flag[maxn];
void insert(int x,int y,int z)
{
	e[++len].to=y;e[len].dis=z;e[len].next=head[x];head[x]=len;
}
void dfs(int x,int d,int c)
{
	if(d>dis||c>mon)
	{
		ans=max(ans,tot);
		return;
	}
	int tem=tot;
	for(int i=head[x];i;i=e[i].next)
	{
		int k=e[i].to;
		if(flag[k]||k==st)continue;
		if(d+e[i].dis<=dis)
		{
			tot++;
			if(c+v[k]<=mon)flag[k]=1;
		}
	}
	ans=max(ans,tot);
	for(int i=head[x];i;i=e[i].next)
	{
		int k=e[i].to;
		if(flag[k])dfs(k,d+e[i].dis,c+v[k]),flag[k]=0;
	}
	tot=tem;
}
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;++i)scanf("%d",&v[i]);
	for(int i=1,x,y,z;i<=m;++i)
	{
		scanf("%d%d%d",&x,&y,&z);
		insert(x,y,z);insert(y,x,z);
	}
	for(int i=1;i<=q;++i)
	{
		scanf("%d%d%d",&st,&mon,&dis);
		memset(f,-1,sizeof(f));
		ans=0;tot=0;
		dfs(st,0,0);
		printf("%d\n",ans);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}