Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1077230
  • 博文数量: 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-19 08:57:55

    最小生成树是对于有权连通图求权重合最小的联通子图问题的算法,注意连通图是不能带环的。像这类问题在算法题中很常见,像求几个城市间网路搭建成本消耗问题就可以运用prim最小生成树来解决。
   最小生成树和Dijkstra算法的思想比较类似, 只是Dijkstra主要关注每个节点的优先级, 而prim关注于相连的边的优先级。详细的还是从代码中看:
   伪代码:
   priority_queue que;
   que.push(startE);   //将源点的边长加入队列
   while que is not empty
        V a = que.top();
          vector T.pushback(a);  //每次取出的边都记录下来,最后这个vector就是最小生成树里所有的边

          que.pop();
        for all V connect with a:
            if d(v) > d(a) + length_a_to_v;
               d(v) = d(a) + length_a_to_v;
               que.push(length_a_to_v);

   直接上代码:
   

点击(此处)折叠或打开

  1. #include <functional>
  2. #include <queue>
  3. #include <vector>
  4. using namespace std;
  5. #define MAXV 4
  6. #define INF 100000
  7. int d[4] = { 0 };
  8. int edge[4][4] = { 0 };
  9. void init()
  10. {
  11.     for (int i = 0; i < MAXV; i++)
  12.         for (int j = 0; j < MAXV; j++)
  13.             edge[i][j] = INF;
  14.     edge[0][0] = 0;
  15.     edge[0][1] = 6;
  16.     edge[1][0] = 6;
  17.     edge[0][2] = 1;
  18.     edge[2][0] = 1;
  19.     edge[1][3] = 2;
  20.     edge[3][1] = 2;
  21.     edge[2][3] = 8;
  22.     edge[3][2] = 8;
  23.     edge[3][0] = 9;
  24.     edge[0][3] = 9;
  25. }

  26. typedef pair<int, int> p;
  27. vector<p> mst_vec;
  28. void MST(p s)
  29. {
  30.     priority_queue<p, vector<p>, greater<p>> que;
  31.     que.push(s);
  32.     while (!que.empty())
  33.     {
  34.         p tmp = que.top();
  35.         que.pop();
  36.         if (mst_vec.size() != MAXV)
  37.             mst_vec.push_back(tmp);
  38.         else
  39.             break;
  40.         for (int i = 0; i < MAXV; i++)
  41.         {
  42.             if (tmp.second != i)
  43.             {
  44.                 if (edge[tmp.second][i] != INF && d[i] > d[tmp.second] + edge[tmp.second][i])
  45.                 {
  46.                     d[i] = d[tmp.second] + edge[tmp.second][i];
  47.                     p newP;
  48.                     newP.first = edge[tmp.second][i];
  49.                     newP.second = i;
  50.                     que.push(newP);
  51.                 }
  52.             }
  53.         }

  54.     }
  55.     for (int i = 0; i < MAXV; i++)
  56.     {
  57.         printf("%d", mst_vec[i].first);
  58.     }

  59. }

  60. int _tmain(int argc, _TCHAR* argv[])
  61. {
  62.     fill(d, d + 4, INF);

  63.     init();
  64.     d[0] = 0;
  65.     p s;
  66.     s.first = 0;
  67.     s.second = d[0];
  68.     MST(s);

  69.     return 0;
  70. }

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