您的位置:首页 > 其它

HDU 2680 Choose the best route (最短路+反向图)

2014-07-15 15:29 113 查看
题目链接:HDU 2680 Choose the best route

题意:图的大小n*n,有m条路和对应的花费,终点s,有w个起点。问是否存在最短时间从起点到终点的路径;

考虑到有多个起点,如果多次调用Dijkstra会超时,逆向思考,把终点作为起点,只要跑一遍最短路就有答案了。

AC代码:

#include<stdio.h>
#include<string.h>
const int INF=99999999;

int map[1010][1010];
int dis[1010],n;

void Dijkstra(int s)
{
	int i,j,t,k;
	bool vis[1010];
	for(i=1;i<=n;i++)
	{
		dis[i]=(s==i? 0:map[s][i]);
		vis[i]=false;
	}
	vis[s]=true;
	dis[s]=0;
	for(i=2;i<=n;i++)
	{
		t=INF;
		for(j=1;j<=n;j++)
		{
			if(!vis[j] && dis[j]<t)
			{
				t=dis[j];
				k=j;
			}
		}
		if(t==INF)
			break;
		vis[k]=true;
		for(j=1;j<=n;j++)
		{
			if(!vis[j] && dis[j]>dis[k]+map[k][j])
			{
				dis[j]=dis[k]+map[k][j];
			}
		}
	}
	
} 
int main()
{
	int i,j,a,b,c;
	int m,s,t,q;

	while(scanf("%d %d %d",&n,&m,&s)!=EOF)
	{
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				map[i][j]=map[j][i]=INF;
			}
		}
		for(i=0;i<m;i++)
		{
			scanf("%d %d %d",&a,&b,&c);
			if(c<map[b][a])
				map[b][a]=c;
		}
		scanf("%d",&t);
		int ans=INF;
		Dijkstra(s);
		for(i=0;i<t;i++)
		{
			scanf("%d",&q);
			if(ans>dis[q])
				ans=dis[q];
		}
		if(ans==INF)
			printf("-1\n");
		else
			printf("%d\n",ans);
	}

return 0;
}


反思:问题正面很难解决,换个角度可以从反面看待一个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: