Dijkstra算法是图论中求单源最短路的一种算法,基本思想可以看啊哈算法,里面讲的比较详细。这里主要说一下我的一点心得,Dijkstra算法的实现由距离数组dis[len],标记数组book[len],和图的储存方式(邻接表or邻接矩阵组成)。Dijkstra可以求一个点到多个点的最短路,也可以求多个点到一个点的最短路。比如说有n个点,求点x到点n的最短路,初始化为(一对多,初始点只有一个,终点有很多。):
memset(book,0,sizeof(book));
for(i=1; i<=n; i++)
dis[i] = tu[x][i];
book[x] = 1;
实现代码为:
for(i=1; i<n; i++)
{
int inf = max,u;//inf是要找出dis数组中值最小的那个,max根据题意设置。
for(j=1; j<=n; j++)
if(book[j]==0 && inf>dis[j])
inf = dis[j] , u = j;
book[u] = 1;
for(k=1; k<=n; k++)
if(book[k]==0 && dis[k]>dis[u]+tu[u][k])//如果点x到点k这条路径大于点x到点u加上u到k这条路径。
dis[k] = dis[u] + tu[u][k];//松弛操作。
}
这样距离数组dis[len]里存的是点x到各个点的最短路径,比如说dis[10]就是点 x 到点10的最短路径。这也是大多数情况下Dijkstra的用法(一对多);
下面说一下多对一,它的思想和一对多刚好相反。其中dis[i] 表示 i 点到目标点的最短路,也就是说初始点有很多,终点只有一个。初始化为:
memset(book,0,sizeof(book));
for(i=1; i<=n; i++)
dis[i] = tu[i][x];//x是终点
book[x] = 1;
实现代码为:
for(i=1; i<n; i++)
{
int inf = max,u;//inf是要找出dis数组中值最小的那个,max根据题意设置。
for(j=1; j<=n; j++)
if(book[j]==0 && inf > dis[j])
inf = dis[j] , u = j;
book[u] = 1;
for(k=1; k<=n; k++)
if(book[k]==0 && dis[k]>dis[u]+tu[k][u])//如果k点到x点的权值大于k到u加上u到x点的权值。
dis[k] = dis[u]+tu[k][u];//松弛操作。
}
这样每个dis[i]表示点i到终点的最短路径,注意路径的方向是 点 i->终点。
我写的比较乱辛苦大家了,如果不理解可以联系我哦。下面给出一道题联系一下:POJ 3268。