1.实验用例

如下图所示的赋权图表示某七个城市及预先算出它们之间的一些直接通信成路造价(单位:万元),试给出一个设计方案,使得各城市之间既能够通信又使总造价最小并计算其最小值.

2实验原理和方法

为了求解最小代价,使花费的总代价最小,这是数学中经典的求解最小耗费生成树的算法。其核心思想是寻找每一步的最优解继而求得全局最优解。

为了求得最小耗费生成树,我们运用数学中经典的Krusal算法,此算法的核心思想是:

1、 假设该图G是不连通的,对该图的边以非降序权重新排列。

2、 对于排序表中的每条边,如果现在把它放入T不会形成回路的话,则把它加入到生成树T中;否则丢弃。(找到两个最小的。可以遍历)

3、 输出最小生成树的结果,得到我们想要的答案。

注:此题简单的思路就是将图转换为邻接矩阵转进行处理,其实就是转换为二维数组进行处理。默认为无穷大,当有权值则记下        权值大小,主要我们是全部遍历。然后找到的话,我们将此结点的flag置为1,并将找到的最小权值置为无穷大,理论上说,也可以不用置为无穷大了,因为已经将flag置为1了。

3、代码如下:

   1:  // third.cpp : 定义控制台应用程序的入口点。
   2:  //
   3:  #include "stdafx.h"
   4:  #include <stdio.h>
   5:  #include<iostream>
   6:  using namespace std;
   7:  #define N 100
   8:  #define MaxNum 65535 //带权值的邻接矩阵默认为最大值
   9:  int tb[N][N];
  10:  void prim(int n, int m,int flag[])  //找到最小权值的那个结点
  11:  {
  12:     int min;
  13:     int first;
  14:     int last;
  15:      min = tb[0][0];
  16:     for(int i = 0; i < n; i++ )
  17:       for(int j = 0; j < n; j++ )//这是一个对称矩阵,整个遍历
  18:       {
  19:         if((flag[j]!=1) &&(min > tb[i][j]))
  20:           {
  21:              min =  tb[i][j];
  22:              first = i;
  23:              last = j;
  24:           }
  25:        }
  26:       flag[first] = 1;
  27:       flag[last] = 1;
  28:       tb[first][last] = MaxNum;  //找到后,将原来的那个权值置为最大值
  29:       cout << "输出找到的结点:"<<first+1 <<"  "<<last+1<< endl;
  30:  }
  31:   
  32:  int main()
  33:  {
  34:    int n, m;
  35:    int i, j;
  36:    int u, v, w; //u v可以理解为行列。
  37:    int flag[N] = {0,};
  38:    cout << "请输入所求图的顶点数目和边的数目:"<<endl;
  39:    cin >> n >> m;
  40:     //构造带权值的邻接矩阵
  41:    for(i = 0; i < n; i++) 
  42:        for(j = 0; j < n; j++)
  43:            tb[i][j] = MaxNum;
  44:    cout <<"请输入两条边的节点序号以及他们的权值:"<< endl;
  45:    for(i = 0; i < m; i++)
  46:    {
  47:        cin >> u >> v >> w;//顶点从1开始
  48:        tb[u-1][v-1] = tb[v-1][u-1] = w; //矩阵存储的时候按0存储。
  49:    }
  50:    for(i = 0; i < n; i++) 
  51:       {
  52:            for(j = 0; j < n; j++)
  53:               cout << tb[i][j] <<"         ";
  54:            cout << endl;   
  55:       } 
  56:    for (int i = 0; i < n; i++ )
  57:      {
  58:          flag [i] = 0;
  59:      }
61:  for(int j = 0; j < n ; j++)  //遍历一次找到一个,这里的flag是整个的局部变量。其实是遍历了n次(n为顶点)二维数组。
  62:    {
  63:        prim(n,m,flag); // 形参:顶点1,以及所有的顶点数目n    
  64:    }
  65:        return 0;
  66:  }
  67:   

4.实验结果

因而最后求得的最小耗费是:此时的最小耗费是:23+1+4+9+3+17=57(万元)

图论 Krusal算法C++实现的更多相关文章

  1. [联赛可能考到]图论相关算法——COGS——联赛试题预测

    COGS图论相关算法 最小生成树 Kruskal+ufs int ufs(int x) { return f[x] == x ? x : f[x] = ufs(f[x]); } int Kruskal ...

  2. Cocos2d-x 地图步行实现1:图论Dijkstra算法

    下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...

  3. 图论——Dijkstra算法

    图论其实是比较难的一种题型,但是一些模板题,是没有什么太大难度的! 这里给大家带来的是迪杰斯特拉(Dijkstra)算法. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄 ...

  4. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  5. [图论]Dijkstra 算法小结

    Dijkstra 算法小结  By Wine93 2013.11 1. Dijkstra 算法相关介绍 算法阐述:Dijkstra是解决单源最短路径的算法,它可以在O(n^2)内计算出源点(s)到图中 ...

  6. [图论]Floyd 算法小结

    Floyd 算法小结  By Wine93 2013.11 1. Floyd算法简介 Floyd算法利用动态规划思想可以求出任意2点间的最短路径,时间复杂度为O(n^3),对于稠密图, 效率要高于执行 ...

  7. ACM(图论)——tarjan算法详解

    ---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求 ...

  8. 图论最短路径算法总结(Bellman-Ford + SPFA + DAGSP + Dijkstra + Floyd-Warshall)

    这里感谢百度文库,百度百科,维基百科,还有算法导论的作者以及他的小伙伴们...... 最短路是现实生活中很常见的一个问题,之前练习了很多BFS的题目,BFS可以暴力解决很多最短路的问题,但是他有一定的 ...

  9. 图论·Floyd算法·HDU2544&1874 (伪)2066

    在看到1874的题时,第一反应是用上一篇的并查集方法,后来查了一下是要用Floyd做,所以就去查Floyd算法的资料. 即插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法. 核心代码:  ma ...

随机推荐

  1. [LOJ#2327]「清华集训 2017」福若格斯

    [LOJ#2327]「清华集训 2017」福若格斯 试题描述 小d是4xx9小游戏高手. 有一天,小d发现了一个很经典的小游戏:跳青蛙. 游戏在一个 \(5\) 个格子的棋盘上进行.在游戏的一开始,最 ...

  2. Error:Cannot find module 'stylus'

    在webpack 里面用了 stylus-loader,但npm instatll 没有正确安装,出现error: Cannot find module ‘stylus’. 解决办法: 重新npm i ...

  3. Struts框架详解

    1.Struts应用框架介绍 (1)框架 框架最简单的形式是指已开发过并已测试过的软件的程序块,这些程序块可以在多个软件开发工程中重用.框架提供了一个概括的体系结构模版,可以用这个模板来构建特定领域中 ...

  4. mybatis 从数据库查询的信息不完整解决办法

    List<Product> products = productService.getProductListWithPage(productQuery); 今天碰到一个很奇怪的现象,上面的 ...

  5. idea如何设置类头注释和方法注释(带注释模板)

    1.idea类注释 打开:file->setting->Editor->Filr and Code Templates->Includes->File Header 类注 ...

  6. uoj 131/bzoj 4199 [NOI2015]品酒大会 后缀树+树d

    题目大意 见uoj131 分析 题目的提示还是很明显的 \(r\)相似就就代表了\(0...r-1\)相似 建出后缀树我们能dfs算出答案 再后缀和更新一下即可 注意 细节挺多的,但数据很良心 不然我 ...

  7. codeforce div2 426 D. The Bakery

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  8. js2:事件的学习,弹出窗口,状态栏字改变,地图热点的使用

    原文发布时间为:2008-11-08 -- 来源于本人的百度文章 [由搬家工具导入] <html> <head> <title>js</title> & ...

  9. Android下设置CPU核心数和频率

    现在的Android手机双核.四核变得非常普遍,同时CPU频率经常轻松上2G,功耗肯定会显著增加.而大多数的ARM架构的CPU采用的是对称多处理(SMP)的方式处理多CPU.这就意味着每个CPU核心是 ...

  10. AC日记——最高奖励 51nod 1163

    最高的奖励 思路: 排序: 时间为第一关键字,按总小到大排: 价值为第二关键字,按从大到小排: 然后,不难看出,如果两个时间不同: 那么,两个时间之间最少能做一件事: 因为他们的时间下限最少相差1: ...