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. 【bzoj4390】[Usaco2015 dec]Max Flow LCA

    题目描述 Farmer John has installed a new system of N−1 pipes to transport milk between the N stalls in h ...

  2. 一道背包神题-Petrozavodsk Winter-2018. Carnegie Mellon U Contest Problem I

    题目描述 有\(n\)个物品,每个物品有一个体积\(v_i\),背包容量\(s\).要求选一些物品恰好装满背包且物品个数最少,并在这样的方案中: (1)求出中位数最小的方案的中位数(\(k\)个元素的 ...

  3. [NOI2010][bzoj2005] 能量采集 [欧拉函数+分块前缀和优化]

    题面: 传送门 思路: 稍微转化一下,可以发现,每个植物到原点连线上植物的数量,等于gcd(x,y)-1,其中xy是植物的横纵坐标 那么我们实际上就是要求2*sigma(gcd(x,y))-n*m了 ...

  4. U盘用FAT32还是用NTFS格式好

    U盘用FAT32还是用NTFS格式好 ● FAT32文件系统 FAT32使用4个字节(也就是32位)的空间来表示每个扇区(Sector)配置文件的情形,故称之为FAT32.FAT16的分区容量上限是2 ...

  5. 论文笔记《Fully Convolutional Networks for Semantic Segmentation》

    一.Abstract 提出了一种end-to-end的做semantic segmentation的方法,也就是FCN,是我个人觉得非常厉害的一个方法. 二.亮点 1.提出了全卷积网络的概念,将Ale ...

  6. EasyUI-Accordion

    EasyUI-Accordion Accordion英文翻译就是 手风琴活 或者 可折叠的 参考效果图: 从图中我们其实也可以将这种组件理解为手风琴式的组件. 该组件方便对数据进行分类管理,在有限空间 ...

  7. Python学习杂记_11_函数(一)

    函数也叫方法,就是把实现某种功能的一组代码封装起来,当你需要这个功能时直接调用函数即可. 定义函数:定义函数时要注意 “def”关键字,“:”,“函数体缩进”:用“return”使函数有具体返回值,没 ...

  8. LeetCode OJ-- Letter Combinations of a Phone Number ***

    https://oj.leetcode.com/problems/letter-combinations-of-a-phone-number/ 使用递归,深搜,使用 map 保存已经处理过的结果 cl ...

  9. 转载自——Json.net动态序列化以及对时间格式的处理

    关于我工作中对Json处理的东西 第一:动态序列化类 第二:时间格式处理 通常我们一个类里 可能有十到更多的属性,但是我们序列化通常只需要序列化其中的 三到五个这样的话就会有多余的数据 如果 我只想序 ...

  10. Network | HTTP protocol

    版本 HTTP/1.0这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中. HTTP/1.1当前版本.持久连接被默认采用,并能很好地配合代理服务器工作.还支持以管道 ...