比赛 NOIP模拟赛by mzx Day1 评测结果 WWWWWWWEEE
题目名称 零食店 最终得分 0
用户昵称 岂是蓬蒿人 运行时间 0.931 s
代码语言 C++ 内存使用 5.53 MiB
提交时间 2016-10-19 21:18:54
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define big 1000000000
#define maxx 110
using namespace std;
int n,m,r,topt,sum;
int c[maxx],w[maxx],f[maxx],dis[maxx][maxx][maxx];
int first[maxx];
struct edge
{
	int to;
	int val;
	int next;
}e[maxx*maxx];
queue<int>q;
int init()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
void add(int x,int y,int z)
{
	topt++;
	e[topt].to=y;
	e[topt].val=z;
	e[topt].next=first[x];
	first[x]=topt;
}
void bfs(int start,int pos)
{
	for(int i=1;i<=n;i++)
	{
		f[i]=0;
		dis[pos][start][i]=big;
	}
	dis[pos][start][start]=0;
	f[start]=1;
	q.push(start);
	while(!q.empty())
	{
		int now=q.front();
		q.pop();f[now]=0;
		for(int i=first[now];i;i=e[i].next)
		{
			int to=e[i].to;
			if(dis[pos][start][now]+e[i].val<dis[pos][start][to])
			{
				dis[pos][start][to]=dis[pos][start][now]+e[i].val;
				if(!f[to]&&w[to]<=c[pos])
				{
					f[to]=1;
					q.push(to);
				}
			}
		}
	}
}
int main()
{
	freopen("snackstore.in","r",stdin);
	freopen("snackstore.out","w",stdout);
	int i,j,k;
	n=init();m=init();r=init();
	for(i=1;i<=n;i++)
	  c[++sum]=w[i]=init();
	c[++sum]=0;
	sort(c+1,c+sum+1);
	int tot=unique(c+1,c+sum+1)-c-1;
	for(i=1;i<=m;i++)
	{
		int x,y,z;
		x=init();y=init();z=init();
		add(x,y,z);add(y,x,z);
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=tot;j++)
		bfs(i,j);
	}
	for(i=1;i<=r;i++)
	{
		int x,y,z,pos=0;
		x=init();y=init();z=init();
		for(j=tot;j>=1;j--)
		{
			if(c[j]<=y)
			{
				pos=j;
				break;
			}
		}
		for(j=1;j<=n;j++)
		if(j!=x&&dis[pos][x][j]<=z)
		printf("%d ",j);
		printf("\n");
	}
	return 0;
}