图论 Krusal算法C++实现
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++实现的更多相关文章
- [联赛可能考到]图论相关算法——COGS——联赛试题预测
COGS图论相关算法 最小生成树 Kruskal+ufs int ufs(int x) { return f[x] == x ? x : f[x] = ufs(f[x]); } int Kruskal ...
- Cocos2d-x 地图步行实现1:图论Dijkstra算法
下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...
- 图论——Dijkstra算法
图论其实是比较难的一种题型,但是一些模板题,是没有什么太大难度的! 这里给大家带来的是迪杰斯特拉(Dijkstra)算法. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- [图论]Dijkstra 算法小结
Dijkstra 算法小结 By Wine93 2013.11 1. Dijkstra 算法相关介绍 算法阐述:Dijkstra是解决单源最短路径的算法,它可以在O(n^2)内计算出源点(s)到图中 ...
- [图论]Floyd 算法小结
Floyd 算法小结 By Wine93 2013.11 1. Floyd算法简介 Floyd算法利用动态规划思想可以求出任意2点间的最短路径,时间复杂度为O(n^3),对于稠密图, 效率要高于执行 ...
- ACM(图论)——tarjan算法详解
---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求 ...
- 图论最短路径算法总结(Bellman-Ford + SPFA + DAGSP + Dijkstra + Floyd-Warshall)
这里感谢百度文库,百度百科,维基百科,还有算法导论的作者以及他的小伙伴们...... 最短路是现实生活中很常见的一个问题,之前练习了很多BFS的题目,BFS可以暴力解决很多最短路的问题,但是他有一定的 ...
- 图论·Floyd算法·HDU2544&1874 (伪)2066
在看到1874的题时,第一反应是用上一篇的并查集方法,后来查了一下是要用Floyd做,所以就去查Floyd算法的资料. 即插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法. 核心代码: ma ...
随机推荐
- P1463 [HAOI2007]反素数
题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...
- FZU Super A^B mod C(欧拉函数降幂)
Problem 1759 Super A^B mod C Accept: 878 Submit: 2870 Time Limit: 1000 mSec Memory Limit : 327 ...
- HDU 4614 Vases and Flowers(线段树+二分)
Vases and Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- vue单文件组件互相通讯
在vue中,我们可以把一个页面各个部分单独封装起来,做成各种小组件,然后加载,这样的好处是代码维护起来比较容易,重复的代码多处调用! 在一个vue项目中,单文件组件以.vue形式文件命名 每个组件之间 ...
- Jury Compromise(poj 1015)
描述在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是: 控方和辩方会根据对候选 ...
- LOJ#2086. 「NOI2016」区间
$n \leq 500000$个区间,从中挑出一些,使得至少有一个点被$m$个选中区间包含,且选中区间长度的极差最小. 区间题死脑筋晚期:把区间按左端点排序,然后右端点用个优先队列来弹,然后需要维护下 ...
- 线程间操作无效: 从不是创建控件“textBox4”的线程访问它
原文发布时间为:2009-03-30 -- 来源于本人的百度文章 [由搬家工具导入] public long str1, str2, str3, str4, str5, sum=0,sum1=0; p ...
- sql查询字段值只为汉字(桃)
SELECT * FROM roster WHERE roster.`name` >'zzzzzzzzzz' //查询roster表中name值为中文的 SELECT * FROM rost ...
- Docker(七):仓库
登录 可以通过执行docker login命令来输入用户名和密码,密码和邮箱来完成注册和登录.注册成功之后,本地用户目录的.dockerfig中将保存用户的认证信息. 使用$sudo docker s ...
- 【Visual Studio】无法打开包括文件:“SDKDDKVer.h”
解决办法是在头文件的搜索目录中添加$(WindowsSDK_IncludePath);,同时在库文件的搜索目录中添加$(WindowsSDK_LibraryPath_x86);