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. 【bzoj1520】[POI2006]Szk-Schools 费用流

    题目描述 输入 输出 如果有可行解, 输出最小代价,否则输出NIE. 样例输入 5 1 1 2 3 1 1 5 1 3 2 5 5 4 1 5 10 3 3 3 1 样例输出 9 题解 费用流 设xi ...

  2. hdu 3045 斜率优化DP

    思路:dp[i]=dp[j]+sum[i]-sum[j]-(i-j)*num[j+1]; 然后就是比较斜率. 注意的时这里j+t<=i: #include<iostream> #in ...

  3. TCP面试题之为什么会有TIME_WAIT状态

    1.确保有足够的时间让对方收到ACK包:(一来一去刚好是2MSL) 2.避免新旧连接混淆 MSL(最大报文段的生成时间)在RFC793中规定hi2分钟,实际应用是30秒,1分钟,2分钟等:

  4. Android注入完全剖析

    0 前沿 本文主要分析了一份实现Android注入的代码的技术细节,但是并不涉及ptrace相关的知识,所以读者如果不了解ptrace的话,最好先学习下ptrace原理再来阅读本文.首先,感谢源代码的 ...

  5. SPOJ QTREE4 SPOJ Query on a tree IV

    You are given a tree (an acyclic undirected connected graph) with N nodes, and nodes numbered 1,2,3. ...

  6. 时间戳/Date(1354116249000)/ 转换

    从C#的Datatime格式通过Json传到Js里面,时间会显示成时间戳/Date(1354116249000)/ ,js转化如下 function GetDateFormat(str) { retu ...

  7. 【Visual Studio - Dependency Walker】查找程序依赖的动态链接库文件(转)

    原文转自 http://163n.blog.163.com/blog/static/5603555220113151113287/ 有时我们需要知道一个程序依赖哪些动态链接库(DLL)文件.实际上,有 ...

  8. VC6.0工程改名(转)

    只讨论对工程改名,其他文件和类的名字不改变,否则就很麻烦了.  操作步骤:   (1)删除 .dsw 文件.改好了会再自动生成的: (2)以写字板或记事本方式打开.dsp文件: (3)将其中所有的原工 ...

  9. python之wxPython菜单使用详解

    import wx APP_EXIT=1 #定义一个控件ID class Example(wx.Frame): def __init__(self, parent, id, title): super ...

  10. 使用layer的iframe层提交表单后,需要关闭当前的iframe层,然后刷新父页面的方法2

    <input type="button" onclick="edit(${it.id?c})" class="layui-btn layui-b ...