hdu2680

/*
分析:
    最短路,水~
把图反向就行了。


                                         2012-06-05
*/










#include"stdio.h"
struct A
{
	int ans;
	int flag;
	int pre;
}E[1011];
int map[1001][1001];
int main()
{
	int n,m;
	int num,s[1001],e;
	int i,l;
	int a,b,t;
	int k;
	int ans;
	while(scanf("%d%d%d",&n,&m,&e)!=-1)
	{
		for(i=1;i<=n;i++)
		for(l=1;l<=n;l++)
		{
			if(i==l)map[i][l]=0;
			else	map[i][l]=11111111;
		}
		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&a,&b,&t);
			map[b][a]=map[b][a]>t?t:map[b][a]; 
		}

		scanf("%d",&num);
		for(i=1;i<=num;i++)	scanf("%d",&s[i]);

		for(i=1;i<=n;i++)
		{
			E[i].ans=11111111;
			E[i].flag=1;
			E[i].pre=i;
		}

		k=e;
		E[k].ans=0;
		while(k)
		{
			E[k].flag=0;


			for(i=1;i<=n;i++)
			{
				if(map[k][i]==11111111)	continue;
				if(E[k].ans+map[k][i]<E[i].ans)
				{
					E[i].ans=E[k].ans+map[k][i];
					E[i].pre=k;
				}
			}

			k=0;
			for(i=1;i<=n;i++)	if(E[i].flag)	{k=i;break;}
			for(i++;i<=n;i++)	if(E[i].flag&&E[i].ans<E[k].ans)	k=i;
		}


		ans=11111111;
		for(i=1;i<=num;i++)	ans=ans>E[s[i]].ans?E[s[i]].ans:ans;


		if(ans==11111111)	printf("-1\n");
		else				printf("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(hdu2680)