/*单元最短路径,这个算法的思想就是每次先找到离原点最近的点,然后以这个点为基础扩展,
然后比较原点到扩展点的距离与原点到最点的距离加上最近点的距离到扩展点的距离,
如果大于的话就需要跟新原来dis中的距离*/
#include<stdio.h>
int book[1000];
int main()
{
int a[20][20],dis[200],u,v,j,i,n,m,t1,t2,t3,min;
int inf=99999;
scanf("%d%d",&n,&m);//输入城市的个数以及道路的条数
//初始化二维数组
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) a[i][j]=0;
else a[i][j]=inf;
for(i=1;i<=m;i++)//输入每条边的权值
{
scanf("%d%d%d",&t1,&t2,&t3);
a[t1][t2]=t3;
}
for(i=1;i<=n;i++)//dis数组中存储原点到每个城市的距离的估计值
dis[i]=a[1][i];
book[1]=1;//将第一个点标记
for(i=1;i<=n-1;i++)/*循环到n-1是因为当前n-1个离原点城市最近的城市找完之后
最后一个城市就不用再找了,他到原点的距离就是最短的*/
{
min=inf;
//寻找离原点城市最近的城市
for(j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++)
{
if(a[u][v]<inf)//确定u能到达v,就是寻找u所扩展出来的是哪些城市
{
if(dis[v]>dis[u]+a[u][v])//如果原点城市到离原点城市最近的城市扩展出的城市的距离比离原点最近城市的距离加上离原点最近城市到其扩展出来城市的距离大则更新dis
dis[v]=dis[u]+a[u][v];
}
}
}
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}
DijKstra算法——单源最短路径的理解
最新推荐文章于 2023-10-17 21:14:40 发布