码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2680 Choose the best route

时间:2015-08-17 21:47:13      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

本题链接:点击打开链接

本题大意:

        输入n,m,s,代表标号为1--n,有m组数据,终点为s。每组数据输入两个点及权值。然后输入w,代表有w个起点,然后输入各起点。求起点到终点的最短时间。

解题思路:

        本题也是最短路径问题。有多个起点,本题也是与hdu 一个人的旅行 采取相同的方法。另外选取一个点,将各起点据此点的距离记为0,并以此点最为起点。

具体请参考代码:

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int map[1010][1010];
int dis[1010];
int mark[1010];
int n;
void dijkstra()//dijkstra算法 
{
	memset(mark,0,sizeof(mark));
	for(int i=1;i<=n;i++)
		dis[i]=INF;
	dis[0]=0;
	for(int i=0;i<=n;i++)
	{
		int vir,min=INF;
		for(int j=0;j<=n;j++)
		if(!mark[j]&&dis[j]<min)
		{
			min=dis[j];
			vir=j;
		}
		if(min==INF)	break;
		mark[vir]=1;
		for(int j=0;j<=n;j++)
			if(!mark[j]&&dis[j]>dis[vir]+map[vir][j])
			dis[j]=dis[vir]+map[vir][j];
	}
}
int main()
{
	int m,s,w,begin;
	while(scanf("%d%d%d",&n,&m,&s)!=EOF)
	{
		for(int i=0;i<1010;i++)
		for(int j=0;j<1010;j++)
			map[i][j]=INF;
		for(int i=0;i<m;i++)
		{
			int p,q,t;
			scanf("%d%d%d",&p,&q,&t);
			if(map[p][q]>t)
			map[p][q]=t;
		}
		scanf("%d",&w);
		for(int i=0;i<w;i++)//将各起点替换为一个起点 
		{
			scanf("%d",&begin);
			map[0][begin]=0;
		}
		dijkstra();
		if(dis[s]==INF)
			printf("-1\n");
		else
			printf("%d\n",dis[s]);
	}
	return 0;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 2680 Choose the best route

标签:

原文地址:http://blog.csdn.net/lsgbb/article/details/47732295

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!