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

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-05-24 21:50:09

1.Kruskal
  每次找出权值最小的边,用并查集判断构成这两个边的顶点是不是有一个根(即构成回路),若不是则加入这条边,直到加入N-1条。
  1. bool Kruskal(GraphLink& minSpanTree)
  2.     {
  3.         // 1.把顶点、顶点数量放入最小生成树
  4.         minSpanTree._linkTable = new LinkVertex<V, W>[_vertexSize];
  5.         minSpanTree._vertexSize = _vertexSize;
  6.         for (int i = 0; i < _vertexSize; ++i)
  7.         {
  8.             minSpanTree._linkTable[i]._vertex = _linkTable[i]._vertex;
  9.         }
  10.         // 2.将所有的边放到一个最小堆
  11.         Heap<LinkEdge<V,W>*, CompareLinkEdge<V,W>> minHeap;
  12.         for (int i = 0; i < _vertexSize; ++i)
  13.         {
  14.             LinkEdge<V, W>* begin = _linkTable[i]._head;
  15.             while (begin)
  16.             {
  17.                 // 无向图的边需要进行过滤
  18.                 if (begin->_srcIndex < begin->_dstIndex)
  19.                 {
  20.                     minHeap.Push(begin);
  21.                 }

  22.                 begin = begin->_next;
  23.             }
  24.         }
  25.         
  26.         // 3.使用并查集和最小堆构建最小生成树
  27.         UnionFindSet UFSet(_vertexSize);
  28.         int count = _vertexSize;
  29.         while (--count)
  30.         {
  31.             if (minHeap.Empty())
  32.             {
  33.                 return false;
  34.             }

  35.             LinkEdge<V,W>* edge = minHeap.Top();
  36.             minHeap.Pop();
  37.             int src = UFSet.Find(edge->_srcIndex);
  38.             int dst = UFSet.Find(edge->_dstIndex);

  39.             if(src != dst)//若两个不是一个根,即没有构成回路
  40.             {
  41.                 UFSet.Union(src, dst);//合成一个根
  42.                 minSpanTree._AddEdge(edge->_srcIndex, edge->_dstIndex, edge->_weight);
  43.             }
  44.         }

  45.         return true;
  46.     }
2.Prim

  1. bool Prim(GraphLink& minSpanTree)
  2.     {
  3.         // 1.初始化最小生成树
  4.         minSpanTree._linkTable = new LinkVertex<V, W>[_vertexSize];
  5.         minSpanTree._vertexSize = _vertexSize;
  6.         for (int i = 0; i < _vertexSize; ++i)
  7.         {
  8.             minSpanTree._linkTable[i]._vertex = _linkTable[i]._vertex;
  9.         }

  10.         bool* visitedSet = new bool[_vertexSize];
  11.         memset(visitedSet, false, sizeof(bool)*_vertexSize);

  12.         int src = 0;
  13.         visitedSet[src] = true;
  14.         Heap<LinkEdge<V,W>*, CompareLinkEdge<V,W>> minHeap;

  15.         int count = 1;
  16.         do
  17.         {
  18.             // 2.取出一个顶点所有未访问过的临接边放到一个最小堆里面
  19.             LinkEdge<V, W>* edge = _GetFirstEdge(src);
  20.             while(edge)
  21.             {
  22.                 if (visitedSet[edge->_dstIndex] == false)
  23.                 {
  24.                     minHeap.Push(edge);
  25.                 }

  26.                 edge = _GetNextEdge(src, edge->_dstIndex);
  27.             }

  28.             // 2.选出堆中最小的边加入生成树
  29.             while(!minHeap.Empty() && count < _vertexSize)
  30.             {
  31.                 edge = minHeap.Top();
  32.                 minHeap.Pop();
  33.                 if (visitedSet[edge->_dstIndex] == false)
  34.                 {
  35.                     minSpanTree._AddEdge(edge->_srcIndex, edge->_dstIndex,edge->_weight);
  36.                     visitedSet[edge->_dstIndex] = true;
  37.                     src = edge->_dstIndex;
  38.                     ++count;

  39.                     break;
  40.                 }
  41.             }
  42.         }while (count < _vertexSize);

  43.         return true;
  44.     }

  45.     W _GetWeight(int src, int dst, const W& maxValue)
  46.     {
  47.         if (src == dst)
  48.             return maxValue;

  49.         LinkEdge<V,W>* edge = _linkTable[src]._head;
  50.         while (edge)
  51.         {
  52.             if (edge->_dstIndex == dst)
  53.             {
  54.                 return edge->_weight;
  55.             }

  56.             edge = edge->_next;
  57.         }

  58.         return maxValue;
  59.     }


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