对Dijkstra的一点点理解。

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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值