一个人的旅行(最短路算法Dijkstra) 多起点多重点问题-解决方法很妙 HDU--2006

题目链接
在这里插入图片描述
在这里插入图片描述

这题是个标准的求最短路径的题目,不过并不是单一起点单一终点,我的解决方法就是再多加一个虚拟起点,将这个虚拟起点与各个起点的距离为0,然后再加一个虚拟终点,将这个虚拟终点到各个终点的距离设置为0,然后求虚拟起点到虚拟终点的最短路径就可以了,这样的处理就转换为单起点单终点的处理,就和畅通工程续问题一样了。
写代码的时候要注意细节,否则很容易掉进循环出不来,注意这个站点是从0开始还是从1开始,注意站点数目的上限值,注意vis的更新,inf的定义,都非常重要,注意初始化imap初始化应该是inf,dis初始化也是inf,还有这句灵魂代码千万不要打错,我就手误打错好几次了,而且检查了好多遍才检查出来
if(imap[start][i]!=inf)
				dis[i]=min(dis[i],imap[start][i]+dis[start]);
最后我们上代码
#include<bits/stdc++.h>
#define inf 0x7FFFFFFF
using namespace std;
int imap[1005][1005],vis[1005],dis[1005];
int main()
{
	int t,s,d,a,b,time,n,start,targe,x,imin,inext;
	while(scanf("%d%d%d",&t,&s,&d)!=EOF)
	{
		for(int i=0;i<1005;i++)
		{
			vis[i]=1;
			dis[i]=inf;
			for(int j=0;j<1005;j++)
			imap[i][j]=inf;
		}
		n=-1;
		while(t--)
		{
			scanf("%d%d%d",&a,&b,&time);
			imap[a][b]=min(imap[a][b],time);
			imap[b][a]=imap[a][b];
			n=max(a,max(b,n));
		}
		start=0;
		targe=n+1;
		n+=1;
		while(s--)
		scanf("%d",&x),imap[x][start]=imap[start][x]=0;
		while(d--)
		scanf("%d",&x),imap[x][targe]=imap[targe][x]=0;
		vis[start]=0;
		dis[start]=0;
		while(start!=targe)
		{
			imin=inf;
			for(int i=0;i<=n;i++)
			{
				if(vis[i]==0)
				continue;
				if(imap[start][i]!=inf)
				dis[i]=min(dis[i],imap[start][i]+dis[start]);//这里太容易错了 
				if(vis[i]&&dis[i]<imin)
				{
					inext=i;
					imin=dis[i];
				}
			}
			if(imin==inf)
			break;
			start=inext;
			vis[start]=0;
		}
		if(dis[targe]==inf)
		puts("-1");
		else
		printf("%d\n",dis[targe]);
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值