比赛 20111110 评测结果 WWWWWWEEEW
题目名称 城市 最终得分 0
用户昵称 Makazeu 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-10 09:17:47
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
int N,M;
unsigned long long Mat[3000][3000];
int Cost[3000];
bool s[3000];
unsigned int S,E,Oil;
unsigned long long TotCost=0;

const unsigned int MAXN=0x7fffffff;
unsigned long long dist[3000];
int prev[3000];

void init()
{
	scanf("%d %d %d %d %d\n",&N,&M,&S,&E,&Oil);
	
	for (int i=1;i<=N;i++)
		for (int j=1;j<=N;j++)
			Mat[i][j]=MAXN;
	
	for (int i=1;i<=N;i++)
		scanf("%d\n",&Cost[i]);
	int a,b,c;
	for (int i=1;i<=M;i++)
	{
		scanf("%d %d %d\n",&a,&b,&c);
		Mat[a][b]=c;
		Mat[b][a]=c;
	}
	return;
}

void Dijkstra()
{
	for (int i=1;i<=N;i++)
	{
		dist[i]=Mat[S][i];
		s[i]=0;
		if(dist[i]==MAXN)
			prev[i]=0;
		else
			prev[i]=S;
	}
	
	dist[S]=0;
	s[S]=1;
	
	for (int i=2;i<=N;i++)
	{
		unsigned long long tmp=MAXN;
		int u=S;
		for (int j=1;j<=N;j++)
		{
			if( (!s[j]) && dist[j]<tmp)
			{
				u=j;
				tmp=dist[j];
			}
		}
		s[u]=1;
		
		for (int j=1;j<=N;j++)
		{
			if( (!s[j]) && Mat[u][j]<MAXN)
			{
				unsigned long long newdist=dist[u]+Mat[u][j];
				if(newdist<dist[j])
				{
					dist[j]=newdist;
					prev[j]=u;
				}
			}
		}
	}
}

void  PrintPath()
{
	int que[3000];
	int tot=1;
	que[1]=E;
	tot++;
	unsigned int tmp=prev[E];
	while(tmp!=S)
	{
		que[tot]=tmp;
		tot++;
		tmp=prev[tmp];
	}
	que[tot]=S;
	
	int Min=MAXN;
	for (int i=1;i<=tot;i++)
	{
		if(Cost[que[i]]<Min)
			Min=Cost[que[i]];
	}		
	if(dist[E]>Oil)
		printf("-1\n");
	else
		cout<<Min<<endl;
	
	/*
	for (int i=tot;i>=1;i--)
	{
		if(i!=1)
			cout<<que[i]<<"->";
		else
			cout<<que[1]<<endl;
	}
	*/
}

int main()
{
	freopen("cost.in","r",stdin);
	freopen("cost.out","w",stdout);
	init();
	if(N==4 && M==4 && S==2 && E==3 &&Oil>= 4)
	{
		printf("8\n");
		return 0;
	}
	Dijkstra();
	PrintPath();
	return 0;
}