本题链接:点击打开链接
本题大意:
输入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;
}
本文介绍了一种解决多起点最短路径问题的算法实现,通过迪杰斯特拉算法求解从多个起点到指定终点的最短时间。文章提供了一个具体的代码示例,展示了如何通过增加一个虚拟起点并将所有实际起点与其距离设为0来简化问题。

3288

被折叠的 条评论
为什么被折叠?



