Chinaunix首页 | 论坛 | 博客
  • 博客访问: 259813
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-05-24 22:10:17


  1. void _Dijkstra(int src, W* dist, int* path, bool* vSet, int size, const W& maxValue)
  2.     {
  3.         //
  4.         // 1.dist初始化src到其他顶点的的距离
  5.         // 2.path初始化src到其他顶点的路径
  6.         // 3.初始化顶点集合
  7.         //
  8.         for (int i = 0; i < size; ++i)
  9.         {
  10.             dist[i] = _GetWeight(src, i, maxValue);
  11.             path[i] = src;
  12.             vSet[i] = false;
  13.         }

  14.         // 将src加入集合
  15.         vSet[src] = true;

  16.         int count = size;
  17.         while(count--)
  18.         {
  19.             //
  20.             // 选出与src顶点连接的边中最小的边
  21.             // src->min
  22.             W min = maxValue;
  23.             int minIndex = src;
  24.             for (int j = 0; j < size; ++j)
  25.             {
  26.                 if (vSet[j] == false && dist[j] < min)
  27.                 {
  28.                     minIndex = j;
  29.                     min = dist[j];
  30.                 }
  31.             }

  32.             vSet[minIndex] = true;
  33.             for (int k = 0; k < size; ++k)
  34.             {
  35.                 if(k == src)
  36.                     continue;

  37.                 //
  38.                 // 更新src->k的距离
  39.                 // 如果dist(src,min)+dist(min, k)的权值小于dist(src, k)
  40.                 // 则更新dist(src,k)和path(src->min->k)
  41.                 //
  42.                 W w = _GetWeight(minIndex, k, maxValue);
  43.                 if (vSet[k] == false && dist[minIndex] + w < dist[k])
  44.                 {
  45.                     dist[k] = dist[minIndex] + w;
  46.                     path[k] = minIndex;
  47.                 }
  48.             }
  49.         }
  50.     }

  51.     void _Dijkstra_OP(int src, W* dist, int* path,
  52.         bool* vSet, int size, const W& maxValue)
  53.     {
  54.         //
  55.         // 1.dist初始化src到其他顶点的的距离
  56.         // 2.path初始化src到其他顶点的路径
  57.         // 3.初始化顶点集合
  58.         //
  59.         for (int i = 0; i < size; ++i)
  60.         {
  61.             dist[i] = _GetWeight(src, i, maxValue);
  62.             path[i] = src;
  63.             vSet[i] = false;
  64.         }

  65.         struct Compare
  66.         {
  67.             bool operator()(const pair<W, int>& lhs, const pair<W, int>& rhs)
  68.             {
  69.                 return lhs.first < rhs.first;
  70.             }
  71.         };

  72.         Heap<pair<W, int>, Compare> minHeap;
  73.         for (int i = 0; i < size; ++i)
  74.         {
  75.             if (dist[i] < maxValue)
  76.             {
  77.                 minHeap.Push(make_pair(dist[i], i));
  78.             }
  79.         }

  80.         // 将src加入集合
  81.         vSet[src] = true;

  82.         int count = size;
  83.         while(count--)
  84.         {
  85.             //
  86.             // 选出与src顶点连接的边中最小的边
  87.             // src->min

  88.             if (minHeap.Empty())
  89.                 continue;

  90.             int minIndex = minHeap.Top().second;
  91.             minHeap.Pop();

  92.             vSet[minIndex] = true;
  93.             for (int k = 0; k < size; ++k)
  94.             {
  95.                 //
  96.                 // 如果dist(src->min)+dist(min, k)的权值小于dist(src, k)
  97.                 // 则更新dist(src,k)和path(src->min->k)
  98.                 //
  99.                 W w = _GetWeight(minIndex, k, maxValue);
  100.                 if (vSet[k] == false && dist[minIndex] + w < dist[k])
  101.                 {
  102.                     dist[k] = dist[minIndex] + w;
  103.                     path[k] = minIndex;

  104.                     minHeap.Push(make_pair(dist[k], k));
  105.                 }
  106.             }
  107.         }
  108.     }

  109.     void PrintPath(int src, W* dist, int* path, int size)
  110.     {
  111.         int* vPath = new int[size];
  112.         for (int i = 0; i < size; ++i)
  113.         {
  114.             if (i != src)
  115.             {
  116.                 int index = i, count = 0;
  117.                 do{
  118.                     vPath[count++] = index;
  119.                     index = path[index];
  120.                 }while (index != src);

  121.                 vPath[count++] = src;

  122.                 //cout<<"顶点:"<<_linkTable[src]._vertex\
  123.                 <<"->顶点:"<<_linkTable[i]._vertex<<"的路径为:";
  124.                 cout<<src<<","<<i<<"的路径为:";
  125.                 while(count)
  126.                 {
  127.                     //cout<<_linkTable[ vSet[--count] ]._vertex<<"->";
  128.                     cout<<vPath[--count]<<"->";
  129.                 }

  130.                 cout<<"路径长度为:"<<dist[i]<<endl;
  131.             }
  132.         }
  133.     }

  134.     void Dijkstra(int src, const W& maxValue)
  135.     {
  136.         W* dist = new W[_vertexSize];
  137.         int* path = new int[_vertexSize];
  138.         bool* vSet = new bool[_vertexSize];

  139.         //_Dijkstra(src, dist, path, vSet, _vertexSize, maxValue);
  140.         _Dijkstra_OP(src, dist, path, vSet, _vertexSize, maxValue);

  141.         // 打印最短路径
  142.         PrintPath(src, dist, path, _vertexSize);

  143.         delete[] dist;
  144.         delete[] path;
  145.         delete[] vSet;
  146.     }

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