最小生成树问题(数据结构课程设计含源码c语言版)

1. 问题要求及任务描述

1.1. 题目要求
问题描述: 给定一个地区的 n 个城市间的距离网,用 Prim 算法或 Kruskal 算法建立最小 生成树,并计算得到的最小生成树的代价。
基本要求:
(1)城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课 本中给出的定义,若两个城市之间不存在道路,则将相应边的权 值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路, 并显示得到的最小生成树的代价。
(2)表示城市间距离网的邻接矩阵(要求至少 6 个城市,10 条边)。
(3)最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。
1.2. 主要任务
最小生成树总体功能要求:在 n 个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。
基本功能:在 n 个城市之间建设网络,只需要架设 n-1 条线路,建立最小生成树即可实现最经济的架设方法。程序可利用克鲁斯卡尔算法或 prim 算法生成最小生成树。

2. 解决问题的主要思路和方法

2.1. 关键问题
求解无向有权图的最小生成树
2.2. 采用解决问题的方法
问题的解决分别采用普利姆算法以及克鲁斯卡尔算法。
普利姆算法就是先选择根,把它放入一个集合 U 中,剩余的顶点放在集合 V 中。然后选择该顶点与 V 中顶点之间权值最小的一条边,以此类推,如果达到最后一个则返回上一个顶点。
克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,以此类推,最终要有一个判断是否生成环,不生成则得到克鲁斯卡尔的最小生成树
**

3. 程序实现

**
3.1. 程序实现时应考虑的问题
定义邻接矩阵:

typedef int  VertexType;
const int MaxVertexNum=10;//设置图最多顶点为10个
const int MaxEdgeNum=56;//设置图最多边为56条
typedef int WeightType;

const WeightType MaxValue=100;//设置最大权值是100即无穷大是100
typedef int adjmatrix[MaxVertexNum][MaxVertexNum];
typedef VertexType vexliist[MaxVertexNum];

算法描述:

void InitMatrix(adjmatrix a, int k)// 对邻接矩阵进行初始化
void CreateAdjoin(adjmatrix GA, int n, char* s)//输入图的边集
void Prim (adjmatrix GA, edgeset CT,int n)//prim算法,n是图的顶点数
void shuchu(edgeset CT,int n)//打印输出最小生成树

3.2. 主要源代码及说明


#include "stdafx.h"
#include<iostream>
#include<strstrea.h>
#include<stdlib.h>
typedef int  VertexType;
const int MaxVertexNum=10;
const int MaxEdgeNum=56;
typedef int WeightType;

const WeightType MaxValue=100;
typedef int adjmatrix[MaxVertexNum][MaxVertexNum];
typedef VertexType vexlist[MaxVertexNum];

struct edge
  • 9
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值