dijkstra算法大家都很熟悉的了,咱废话少说,贴代码
memset(book, 0, sizeof(book)); ///预处理初始化
for(int i=1; i<=n; i++)
dis[i] = (i == 1 ? 0 : INF);
for(int i=1;i<=n;i++)
dis[i]=num[1][i]; ///初始化dis数组,这里是1号点到其余各个顶点的初始路程
book[1]=1; ///注意此处跟下文的不同,这里把源点标记
for(int i=1; i<n; i++){ ///dijkstra,这里只需n-1次
int x, m = INF;
for(int y=1; y<=n; y++)
if(!book[y] && dis[y] < m){ ///找离源点最短的距离
x = y; ///最短距离的下标
m = dis[y]; ///最短距离
}
book[x] = 1; ///标记,表示源点到x点距离已经确定好了
for(int y=1; y<=n ;y++) dis[y] = min(dis[y], dis[x] + num[x][y]);///松弛操作
}
for(int i=1;i<=n;i++) ///输出更新的源点到其余各个顶点的更新的最短距离
printf("%d ",dis[i]);
putchar('\n');
memset(book, 0, sizeof(book)); ///预处理初始化
for(int i=1; i<=n; i++)
dis[i] = (i == 1 ? 0 : INF);///INF表示很大的一个值
///注意此处没有将源点标记,这是一个不同的
for(int i=1; i<=n; i++){ ///dijkstra这里需n次
int x, m = INF;
for(int y=1; y<=n; y++)
if(!book[y] && dis[y] < m){ ///找离源点最短的距离
x = y; ///最短距离的下标
m = dis[y]; ///最短距离
}
book[x] = 1; ///标记,表示源点到x点距离已经确定好了
for(int y=1; y<=n ;y++) dis[y] = min(dis[y], dis[x] + num[x][y]);///松弛操作
}
for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
putchar('\n');
第一篇代码,初始化源点到其余各个顶点的初始距离,并一开始就标记的源点。而第二篇没有初始化的源点到其余各个顶点的初始距离,只把各个距离初始化为INF,并把源点到源点的距离初始化为0,刚开始不标记。
对于第二篇代码,刚进去之后,找的最小值m,肯定是源点,因为其余点都是INF,紧接着松弛完后,最终得到的dis数组的值跟
第一篇代码初始时赋的值时一样的。还有第一篇因为刚开始初始化了源点到其余各个顶点的距离,所以只需n-1次松弛就ok了,而第二篇就得需要n次松弛。这就是他们之间的不同,挑篇喜欢的用就行了。