hdu 2680 Choose the best route

点击打开链接

TLE 一次,自己是把各个起点开始都算一次取最小的,结果超时。。。

后来看了一下结题报告,原来可以当做从0开始,,NB的大神。。

#include"stdio.h"
#include"string.h"
#define INF 999999
int map[1001][1001],mark[1001],f[1001];
int n,m,t,e;
int min(int x,int y)
{
	return x<y?x:y;
}
int dijkstra(int s)
{
	int i,j,k,m;
	memset(mark,0,sizeof(mark));
	for(i=1;i<=n;i++)
		f[i]=map[s][i];
	f[s]=0;mark[s]=1;
	for(i=1;i<=n;i++)
	{
		m=INF;
		for(j=1;j<=n;j++)
			if(!mark[j]&&f[j]<m)
			{
				m=f[j];k=j;
			}
		if(m==INF)break;
		mark[k]=1;
		for(j=1;j<=n;j++)
			if(!mark[j]&&f[j]>f[k]+map[k][j])
				f[j]=f[k]+map[k][j];
	}
	if(f[e]<INF)return f[e];
	else return -1;
}
int main()
{
	int s,i,j,a,b,c,ans,mm;
	while(scanf("%d%d%d",&n,&m,&e)!=EOF)
	{
		for(i=0;i<=n;i++)
			for(j=0;j<=n;j++)
				map[i][j]=(i==j?0:INF);

		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			map[a][b]=min(map[a][b],c);
		}
		scanf("%d",&t);
		mm=INF;
		while(t--)
		{
			scanf("%d",&s);
			map[0][s]=0;
		}
		ans=dijkstra(0);
		if(ans==-1)
		printf("-1\n");
		else printf("%d\n",ans);
	}
	return 0;
}


posted on 2012-07-25 15:48  Slege  阅读(90)  评论(0编辑  收藏  举报

导航