比赛 20101116 评测结果 WWWAAWWAWA
题目名称 城市 最终得分 40
用户昵称 Pom 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-16 09:45:57
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

const int oo=2000000000;
const int MAXM=120000;
const int MAXN=10020;
const int M=MAXN*10;

struct edge
{
	int t,c;
	edge *p;
}e[MAXM],*V[MAXN];

struct fifo
{
	int pos,use,c;
}q[MAXN*11],tmp;

int es=-1,n,m,u,v,i,j,k,h,t,S,s,d[MAXN][300],c[MAXN],ans=oo;
bool iq[MAXN][300];

inline void addedge(int i,int j,int c)
{
	e[++es].t=j; e[es].c=c; e[es].p=V[i]; V[i]=e+es;
}

void init()
{
	freopen("cost.in","r",stdin);
	freopen("cost.out","w",stdout);
	scanf("%d%d%d%d%d",&n,&m,&u,&v,&s);
	for (i=1;i<=n;i++)
		scanf("%d",&c[i]);
	for (;m>0;m--)
	{
		scanf("%d%d%d",&i,&j,&k);
		addedge(i,j,k);
		addedge(j,i,k);
	}
}

void solve()
{
	h=t=S=1;
	memset(iq,false,sizeof(iq));
	for (i=1;i<=n;i++)
		for (j=0;j<=s;j++)
			d[i][j]=oo;
	d[u][0]=0;
	iq[u][0]=true;
	q[1].use=0;
	q[1].c=0;
	q[1].pos=u;
	while (S)
	{
		tmp=q[h];
		for (edge *x=V[tmp.pos];x;x=x->p)
			if (x->c+tmp.use<=s)
			{
				int YOU=x->c+tmp.use;
				if (max(tmp.c,c[x->t])<d[x->t][YOU])
				{
					d[x->t][YOU]=max(tmp.c,c[x->t]);
					iq[x->t][YOU]=true;
					t=(t+1)%M;
					S++;
					q[t].use=YOU;
					q[t].c=d[x->t][YOU];
					q[t].pos=x->t;
				}
			}
		iq[tmp.pos][tmp.use]=false;
		S--;
		h=(h+1)%M;
	}
	for (i=0;i<=s;i++)
		if (d[v][i]<ans) ans=d[v][i];
	if (ans==oo) printf("-1\n");
	else printf("%d\n",ans);
}

int main()
{
	init();
	if (s<300)
		solve();
	else printf("-1\n");
	return 0;
}