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. FreeBSD 用kgdb调试kernel dump文件

    FreeBSD 用kgdb调试kernel dump文件 来自: http://blog.csdn.net/ztz0223/article/details/8600052 kgdb貌似和ddb一样属于 ...

  2. 控制台或Winform程序中如何编码或解码Server.URLEncode

    原文发布时间为:2010-07-10 -- 来源于本人的百度文章 [由搬家工具导入] 在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特 ...

  3. 关于百度富文本编辑器UEdit的初始化内容失败问题

    百度富文本编辑器毫无疑问是强大的,但也会出问题.这个问题是在脚本中普遍存在的,由异步性导致的加载顺序问题. 我们使用 var ue = UE.getEditor('editor', {}); 创建实例 ...

  4. android init.rc命令快速对照表

    注1:另外还讲述了怎样输出log: Debugging notes---------------By default, programs executed by init will drop stdo ...

  5. 安装聊天软件telegram-cli

    Telegram是一款加密通信的聊天软件,可以在linux,windows,android,chrome等运行.官方网址:https://telegram.org/ 它是有桌面版的,但作为一个linu ...

  6. Oracle创建自增长主键

    Oracle主键常用的分为UUID和自增长int两种,下面简单说下各自的优缺点: UUID的优点 1.生成方便,不管是通过sys_guid() 还是java的uuid都能很方便的创建UUID. 2.适 ...

  7. hdu 5698(杨辉三角的性质+逆元)

    ---恢复内容开始--- 瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limi ...

  8. hexo添加百度统计

    litten的主题yilia 编辑文件 themes/yilia/_config.yml,添加一行配置,可以删除原来的google analytics baidu_tongji: true 新建 th ...

  9. 【转载】SQL SERVER 函数大全

    SQL Server 函数大全 一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下 ...

  10. EventBus 3.0: 入门使用及其使用 完全解析

    前言 EventBus是greenrobot再Android平台发布的以订阅-发布模式为核心的开源库. EventBus翻译过来是事件总线意思.可以这样理解:一个个(event)发送到总线上, 然后E ...