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