Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1075758
  • 博文数量: 77
  • 博客积分: 821
  • 博客等级: 军士长
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 16:17
个人简介

学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com

文章分类

全部博文(77)

文章存档

2016年(4)

2015年(15)

2014年(16)

2013年(12)

2012年(21)

2011年(9)

分类: C/C++

2015-02-18 10:20:55

   bellmanford算法是通用的单源最短路径求解算法,相比Dijkstra,复杂度稍差 , 但是可以处理含有负边的图路径问题,所以比较适合通用的图。
  这里给出对于该算法的伪代码:
  all V:
  d(v) = INF;
  for(i = 0; i< |V| ; i++)
        for(j = 0; j<|E|;j++)
            update d(i)
  从伪代码可以看出 , bellman算法是对每一条边都做一次跟新操作,如果每条边都无需再更新的时候,单源最短路径问题也就求出来了
  bellman算法对于负环存在的问题, 也很容易求解,如果存在负环,必然会存在i = |V| - 1的情况,所以只要在适当的时候对这个值进行判断就可以知道是否存在负环了
  
  下面是实现的代码:
   

点击(此处)折叠或打开

  1. typedef struct edge_st
  2. {
  3.     int from;
  4.     int to;
  5.     int cost;
  6. }edge;
  7. #define MAXEDGE 5
  8. #define MAXV 4
  9. int d[MAXV] = { 0 };
  10. edge es[MAXEDGE] = { 0 };

  11. void init()
  12. {
  13.     edge es1 = { 0, 1, 2 };
  14.     edge es2 = { 3, 0, 2 };
  15.     edge es3 = { 0, 2, 5 };
  16.     edge es4 = { 3, 1, 6 };
  17.     edge es5 = { 2, 3, 2 };
  18.     es[0] = es1;
  19.     es[1] = es2;
  20.     es[2] = es3;
  21.     es[3] = es4;
  22.     es[4] = es5;
  23. }

  24. #define INF 100000

  25. int _tmain(int argc, _TCHAR* argv[])
  26. {
  27.     init();
  28.     for (int i = 0; i < MAXV; i++)
  29.     {
  30.         d[i] = INF;
  31.     }
  32.     d[0] = 0;
  33.     bool update = true; //设置更新标志, 如果每条边都没有跟新了就为false
  34.     for (int j = 0; j < MAXV; j++)
  35.     {
  36.         if (!update)
  37.         {
  38.             printf("has find the shortest path\n");
  39.             break;
  40.         }
  41.         update = false;
  42.         for (int i = 0; i < MAXEDGE; i++)
  43.         {
  44.             if (d[es[i].from] != INF && d[es[i].to] > es[i].cost + d[es[i].from])
  45.             {
  46.                 d[es[i].to] = d[es[i].from] + es[i].cost;
  47.                 update = true;
  48.             }
  49.         }
  50.         if (j == (MAXV - 1))
  51.         {
  52.             printf("The edge is negative loop\n"); //判断是否有负环存在
  53.             return 0;
  54.         }
  55.     }

  56.     for (int i = 0; i < MAXV; i++)
  57.     {
  58.         printf("%d\n",d[i]);
  59.     }
  60.     return 0;
  61. }


阅读(1394) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~