比赛 20101116 评测结果 WWWWWWEAWW
题目名称 城市 最终得分 10
用户昵称 wangwangdog 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-16 11:25:14
显示代码纯文本
#include<stdio.h>
FILE *fin,*fout;
long  long n,m,min,find,map[4001][4001],d[4001],t[4001],money[4001],s,a,b,c,x,y,flag[4001],i,dd,j;
long dij(long mon)
{
	long oo,all=0;
	for(oo=1;oo<=n;oo++)
	{
		d[oo]=map[x][oo];
		if(money[t[oo]]>mon)flag[oo]=1;
		else {flag[oo]=0;all++;}
	}
	if(flag[y]==1)return -1;
	flag[x]=1;
	all--;
	while(all>0)
	{
		long minp;
		long min=2100000000;
		for(oo=1;oo<=n;oo++)
		{
			if(flag[oo]==0&&d[oo]<=min){min=d[oo];minp=oo;}
		}
		flag[minp]=1;
		all--;
		for(oo=1;oo<=n;oo++)
		{
			if(flag[oo]==0&&d[minp]+map[minp][oo]<d[oo])
				d[oo]=d[minp]+map[minp][oo];
		}
	}
	return d[y];
}
void qsort(long aa,long bb)
{
	long t1=aa,t2=bb,t3=(aa+bb)/2;
	do
	{
		while(money[t[t1]]<money[t[t3]])t1++;
		while(money[t[t2]]>money[t[t3]])t2--;
		if(t1<=t2)
		{
			int o=t[t1];
			t[t1]=t[t2];
			t[t2]=o;
			t1++;
			t2--;
		}
	}
	while(t1<t2);
	if(t1<bb)qsort(t1,bb);
	if(t2>aa)qsort(aa,t2);
}
int main()
{
	fin=fopen("cost.in","rb");
	fout=fopen("cost.out","wb");
	fscanf(fin,"%lld%lld%lld%lld%lld\n",&n,&m,&x,&y,&s);
	if(n<=6000)
	{
	for(i=1;i<=n;i++)
	{
		fscanf(fin,"%lld\n",&money[i]);
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			map[i][j]=2100000000;
	for(i=1;i<=m;i++)
	{
		fscanf(fin,"%lld%lld%lld\n",&a,&b,&c);
		if((map[a][b]!=2100000000&&c<map[a][b])||(map[a][b]==2100000000))
		{
			map[a][b]=c;
			map[b][a]=c;
		}
	}
	for(i=1;i<=n;i++)
		t[i]=i;
	qsort(1,n);
	find=0;
	min=2100000000;
	for(i=1;i<=n;i++)
	{
		dd=dij(money[t[i]]);
		if(dd<=s&&money[t[i]]<min&&dd!=-1){min=money[t[i]];find=1;break;}
	}
	if(find==0)fprintf(fout,"-1");
	else fprintf(fout,"%lld",min);
	}
	else fprintf(fout,"-1");
	fclose(fin);
	fclose(fout);
	return 0;
}