数据结构|最小生成树问题
最小生成树问题
一、需求分析
问题描述:在n个城市间建设信网络,只需要架设n-1条线路即可。以最低的代价建设这个通信网,即求图的最小生成树。
基本功能:程序运用普利姆算法或克鲁斯卡尔算法求网的最小生成树及它们之间的权值,输入各城市的数目以及各个城市之间的距离。将城市之间的距离当做网中各点之间的权值。
输入输出:输出结果为文本形式的最小生成树和它们之间的权值。程序演示过程是以用户和计算机对话的形式进行的,即在计算机终端中显示提示信息后,用户自主选择下一-步命令,然后计算机显示相应的输入数据和运算结果。
二、概要设计
- 设计思路:
1)给出数据结构的相关定义。
2)采用数组(邻接矩阵)表示法,构造无向网G。
3)用普里姆算法或kruskal的算法构造网G的最小生成树T,输出T的各条边。
克鲁斯卡尔(Kruskal)算法简介:
算法思想:设连通网N=(V, {E}),令最小生成树
(1)初始状态为只有n个顶点而无边的非连通图T=(V, { }),每个顶点自成一个连通分量;
(2)在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到中;否则,舍去此边,选取下一条代价最小的边;
(3)依此类推,直至T中所有顶点都在同一连通分量上为止。
- 程序结构设计:
本程序主要包括四个模块:
(1)主程序模块
(2)堆排序模块:包括heapadjust和heapsort
(3) kruskal算法模块,采用堆排序,有优化
(4)并查集模块:MFSet
三、详细设计
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,tot=0,k=0;//n端点总数,m边数,tot总权值,k表示连接了多少边
int flag[200010];//团体的flagstruct node
{int from,to,dis;//结构体储存边
}edge[200010],t;int find(int x)//找团体的flag,作为并查集的一部分
{if(flag[x]!=x)return find(flag[x]);else return x;
}void unionn(int x,int y)//加入团体,作为并查集的一部分
{flag[find(y)]=find(x);
}int main()
{printf("请输入总的点数和总边数,并以空格隔开:\n");scanf("%d %d",&n,&m);//输入点数、边数printf("请输入每条边的起点终点和权值:\n");for(int i=1;i<=m;i++){scanf("%d %d %d",&edge[i].from,&edge[i].to,&edge[i].dis);//输入边的信息}for(int i=1;i<=n;i++) flag[i]=i;//自己最开始就是flag,即初始化)for(int i =0;i < m;i++){for(int j = 0;j < m;j++){if(edge[j].dis > edge[j+1].dis){t = edge[j] ;edge[j]= edge[j+1];edge[j+1] = t;}}}for(int i=1;i<=m;i++)//从小到大遍历{if(k==n-1) break;//n个点需要n-1条边连接if(find(edge[i].from)!=find(edge[i].to))//假如不在一个团体{printf("\n%d %d %d",edge[i].from,edge[i].to,edge[i].dis);unionn(edge[i].from,edge[i].to);//加入tot+=edge[i].dis;//记录边权k++;//已连接边数 +1}}printf("\n总权值是:%d",tot);return 0;
}
四、测试结果
数据结构|最小生成树问题相关推荐
- 【数据结构笔记29】最小生成树问题:Prim算法与Kruskal算法
本次笔记内容: 8.1.1 Prim算法 8.1.2 Kruskal算法 文章目录 最小生成树问题 什么是最小生成树(Minimum Spanning Tree) 贪心算法 Prim算法 Kruska ...
- 数据结构与算法-Prim算法解析与解决修路最小生成树问题
文章目录 简介 Prim算法 最小生成树 应用场景 问题描述 思路分析 代码实现 简介 Prim算法 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索 ...
- 【数据结构】最小生成树问题(Prim算法和Kruskal算法)
相关概念 连通图与它的生成树 连通图的生成树是包含图中全部顶点的一个极小连通子图.若图的顶点数为n,则它的生成树含有n-1条边.一个连通图可能拥有多个生成树. 最小生成树(Minimum-Spanni ...
- 实验1 最小生成树问题【Kruskal+Prim】
1.贪心算法思想 贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解.因此能够使用贪心算法的问题必须满足下面的两个性质: 1.整体的最优解可以 ...
- 最小生成树 kruskal_使用Kruskal算法求解Java最小生成树问题
最小生成树 kruskal In Electronic Circuit we often required less wiring to connect pins together. We can m ...
- 并查集-算法详解及例题(最小生成树问题)
一.并查集的概念: 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的 Kruskal 算法和求 ...
- 使用贪心算法解决最小生成树问题。
使用贪心算法解决最小生成树问题. #include<iostream> #include<algorithm> using namespace std; const int M ...
- 【算法】Kruskal算法(解决最小生成树问题) 含代码实现
Kruskal算法和Prim算法一样,都是求最小生成树问题的流行算法. 算法思想: Kruskal算法按照边的权值的顺序从小到大查看一遍,如果不产生圈或者重边,就把当前这条边加入到生成树中. 算法的正 ...
- Python小白的数学建模课-18.最小生成树问题
Python小白的数学建模课-18.最小生成树问题 最小生成树(MST)是图论中的基本问题,具有广泛的实际应用,在数学建模中也经常出现. 路线设计.道路规划.官网布局.公交路线.网络设计,都可以转化为 ...
最新文章
- 带有框架的iOS应用在设备上崩溃,dyld:库未加载,Xcode 6 Beta
- exim远程命令执行漏洞分析(cve-2019-10149)
- 如何用程序删除win 7下SYSTEM权限的目录
- C#中提示:可访问性不一致:参数类型XXX比方法XXX的可访问性低
- Caffe学习(十)protobuf及caffe.proto解析
- 函数式编程中的两个棘手问题
- kafka----kafka connect的使用(一)
- 使用VSCode如何调试C#控制台程序_2_加深总结
- 学习记录 | ZigBee协议栈工作流程
- 微信小程序云开发--云存储的使用(一)
- PostgreSQL获得去、今、明年份、今年的第一天、去年的第一天转换时区、最后一天等
- Word中页眉文字下横线如何变化粗细线型,页脚文字上方如何添加横
- 根据经纬度查询数据mysql
- 厦大2021期中考试
- 企业建站选择阿里云服务器配置详细教程
- 关于Telegram广告的那些事: 推广原因及推广途径
- 计算机科学与技术专业 ppt,计算机科学与技术专业.ppt
- EXCEL校验身份证号码和银行卡号
- 假面舞会狂欢节·圆桌 | 当Thinker遇上Artist
- 【随机优化】李雅普诺夫优化在通信与排队系统中的应用(第一章)-绪论