图论 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 ...
随机推荐
- 【bzoj1336/1337/2823】[Balkan2002]Alien最小圆覆盖 随机增量法
题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000. ...
- HDU 5884 Sort(二分答案+计算WPL的技巧)
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Python之面向对象:继承
概念:子类继承父类的属性和方法. 一个派生类(derived class)继承基类(bass class)字段和方法.继承也允许把一个派生类的对象作为一个基类对象对待. 一.单继承 :推崇.特点和使用 ...
- wsl折腾记
参考1 wsl在哪 C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndg ...
- bzoj 1367 - sequence
Description 给定一个序列\(t_1,t_2,\cdots,t_n\),求一个递增序列\(z_1<z_2<...<z_n\), 使得 \(R=|t_1−z_1|+|t_2− ...
- poj 3250 Bad Hair Day
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21084 Accepted: 7202 Des ...
- pat 甲级 Public Bike Management
Public Bike Management (30) 题目描述 There is a public bike service in Hangzhou City which provides grea ...
- pat 团体天梯 L1-046. 整除光棍
L1-046. 整除光棍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 翁恺 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1 ...
- T-SQL还有个内置方法NULLIF()
declare @cypic varchar if (NULLIF(@cypic, '') IS NOT NULL) begin print 1 end else begin print 2 end ...
- USACO 刷题记录bzoj
bzoj 1606: [Usaco2008 Dec]Hay For Sale 购买干草——背包 #include<cstdio> #include<cstring> #incl ...