比赛 20111110 评测结果 AAAAAAAWWA
题目名称 城市 最终得分 80
用户昵称 Czb。 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-10 11:01:21
显示代码纯文本
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define min(a,b)  a<b?a:b

int n,m,x,y,s,tmp,ans,flag,l[100001],f[10001],ff[10001],t[10001],u[10001][1200],v[10001][1200];

bool ok,b[10001];

int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}

void bfs(int k)
{
	int i,S,e;
	S=e=1;
	l[1]=k;
	while(S<=e)
	{
		for(i=1;i<=t[l[S]];i++)
		{
			if(u[l[S]][i]==y)
			{
				ok=true;
				return;
			}
			if(v[l[S]][i]+tmp<=s&&!b[u[l[S]][i]]&&ff[u[l[S]][i]]<=flag)
			{
				e++;
				l[e]=u[l[S]][i];
				b[l[e]]=true;
			}
		}
		S++;
	}
}

void solve(int l,int r)
{
	if(l>r)
		return;
	int k;
	k=(l+r)>>1;
	flag=f[k];
	ok=false;
	if(ff[x]<=flag&&ff[y]<=flag)
	{
		memset(b,0,sizeof(b));
		bfs(x);
	}
	if(ok)
	{
		ans=min(ans,flag);
		solve(l,k-1);
	}
	else
	{
		solve(k+1,r);
	}
}

int main()
{
	freopen("cost.in","r",stdin);
	freopen("cost.out","w",stdout);
	int i,j,a,B,c;
	scanf("%d%d%d%d%d",&n,&m,&x,&y,&s);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&f[i]);
		ff[i]=f[i];
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&B,&c);
		flag=0;
		for(j=1;j<=t[a];j++)
		{
			if(u[a][i]==B)
			{
				flag=i;
				break;
			}
		}
		if(flag)
		{
			v[a][flag]=min(v[a][flag],c);
			for(j=1;j<=t[B];j++)
			{
				if(u[B][i]==a)
				{
					v[B][i]=min(v[B][i],c);
					break;
				}
			}
		}
		else
		{
			t[a]++;
			u[a][t[a]]=B;
			v[a][t[a]]=c;
			t[B]++;
			u[B][t[B]]=a;
			v[B][t[B]]=c;
		}
	}
	qsort(f+1,n,4,cmp);
	b[x]=true;
	ans=2000000000;
	solve(1,n);
	if(ans==2000000000)
	{
		ans=-1;
	}
	printf("%d\n",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}