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

本文介绍了如何使用Prim和Kruskal算法解决最小生成树问题。在数据结构课程设计中,通过C语言实现,针对包含7个城市的距离网,展示了如何构建并计算最小生成树的代价。程序详细描述了Prim算法的步骤,并提供了测试案例,同时讨论了在实现过程中遇到的数据类型和指针空间问题及解决方案。
摘要由CSDN通过智能技术生成

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];

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值