数据结构|最小生成树问题

本文介绍了最小生成树问题,探讨如何在n个城市间构建最低成本的通信网络。内容包括问题描述、基本功能、概要设计,重点讲解了克鲁斯卡尔算法的原理和程序设计思路,涉及堆排序和并查集模块的使用,以实现最小生成树的构造。
摘要由CSDN通过智能技术生成

最小生成树问题

一、需求分析

  1. 问题描述:在n个城市间建设信网络,只需要架设n-1条线路即可。以最低的代价建设这个通信网,即求图的最小生成树。

  2. 基本功能:程序运用普利姆算法或克鲁斯卡尔算法求网的最小生成树及它们之间的权值,输入各城市的数目以及各个城市之间的距离。将城市之间的距离当做网中各点之间的权值。

  3. 输入输出:输出结果为文本形式的最小生成树和它们之间的权值。程序演示过程是以用户和计算机对话的形式进行的,即在计算机终端中显示提示信息后,用户自主选择下一-步命令,然后计算机显示相应的输入数据和运算结果。

二、概要设计

  1. 设计思路:
    1)给出数据结构的相关定义。
    2)采用数组(邻接矩阵)表示法,构造无向网G。
    3)用普里姆算法或kruskal的算法构造网G的最小生成树T,输出T的各条边。

克鲁斯卡尔(Kruskal)算法简介:
算法思想:设连通网N=(V, {E}),令最小生成树
(1)初始状态为只有n个顶点而无边的非连通图T=(V, { }),每个顶点自成一个连通分量;
(2)在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到中;否则,舍去此边,选取下一条代价最小的边;
(3)依此类推,直至T中所有顶点都在同一连通分量上为止。

  1. 程序结构设计:
    本程序主要包括四个模块:
    (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];//团体的flag

struct node
{
   
    int from,to,dis;//结构体储存边
}edge[200010],t;


  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值