hdu 2680 Choose the best route

本文介绍了一种解决多起点最短路径问题的算法实现,通过迪杰斯特拉算法求解从多个起点到指定终点的最短时间。文章提供了一个具体的代码示例,展示了如何通过增加一个虚拟起点并将所有实际起点与其距离设为0来简化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题链接:点击打开链接

本题大意:

        输入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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值