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. 【bzoj2529】[Poi2011]Sticks 贪心

    题目描述 给出若干木棍,每根木棍有特定的颜色和长度.问能否找到三条颜色不同的木棍构成一个三角形.(注意这里所说的三角形面积要严格大于0) 输入 第一行给出一个整数k(3<=k<=50),表 ...

  2. 【bzoj4555】[Tjoi2016&Heoi2016]求和 NTT

    题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) ...

  3. Python基础教程笔记 第一章

    /  表示整除,当导入_future_模块中的version时,/ 表示正常的的除法, 此时可用//表示整除,不论数字是整型还是浮点型,都可以用//表示整除. ** 表示幂次方  例如 2**3    ...

  4. html5拖动文件上传

    使用html5的fileReader api <!DOCTYPE html><html lang="en"><head> <meta ch ...

  5. 【MFC】Tab Control 控件的使用(转)

    原文转自 http://blog.csdn.net/hustspy1990/article/details/5425365 1.先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control ...

  6. Method, apparatus, and system for speculative abort control mechanisms

    An apparatus and method is described herein for providing robust speculative code section abort cont ...

  7. java通过读取本地文件获取反射方法参数,执行对象方法

    运用到的知识点 IO流, 集合properties   反射 在工程目录下新建file   config.properties #one time only can run one method cl ...

  8. SHELL判断服务是不是正在运行

    使用SHELL脚本进行检查服务开启情况 #!/bin/bash #需要首先安装 yum install nmap -y #检查指定端口是否开启 function checkPortStatus() { ...

  9. Needle in a haystack: efficient storage of billions of photos 【转】

    转自09年的blog,因为facebook在国内无法访问,故此摘录. The Photos application is one of Facebook’s most popular features ...

  10. ActiveMQ 权限(二)

    在 ActiveMQ 权限(一) 配置了对消息队列的权限,以下设置完成消息的权限,比如只接受某ip的消息. 两步完成, 第一步:继承接口org.apache.activemq.security.Mes ...