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