实验目的:掌握图的存储表示和以及图的最小生成树算法。
二、实验内容:
实现图的存储,并且读入图的内容。
利用克鲁斯卡尔算法求网络的最小生成树。
实现构造生成树过程中的连通分量抽象数据类型。
以文本形式输出对应图的最小生成树各条边及权值。
三、实验要求:
在上机前写出全部源程序;
能在机器上正确运行程序;
用户界面友好。
需求分析:
1、利用克鲁斯卡尔算法求网的最小生成树;
2、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列;
3、输入为存在边的顶点对,以及它们之间的权值;输出为所得到的邻接矩阵以及按权排序后的边和最后得到的最小生成树;
克鲁斯卡尔算法:假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,按照构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至只有一棵树,也即子图中含有 n-1条边为止。
测试数据:
自行指定图进行运算
四、详细设计
源程序
#include<>
#include<>
#define M 20
#define MAX 20
typedef struct
{
int begin;
int end;
int weight;
}edge;
typedef struct
{
int adj;
int weight;
}AdjMatrix[MAX][MAX];
typedef struct
{
AdjMatrix arc;
int vexnum, um;
}MGraph;
void CreatGraph(MGraph *);
void sort(edge* ,MGraph *);
void MiniSpanTree(MGraph *);
int Find(int *, int );
void Swapn(edge *, int, int);
void CreatGraph(MGraph *G)
{
int i, j,n, m;
printf("请输入边数和顶点数:");
scanf("%d %d",&G->um,&G->vexnum);
for (i = 1; i <= G->vexnum; i++)
{
for ( j = 1; j <= G->vexnum; j++)
{
G->arc[i][j].adj = G->arc[j][i].adj = 0;
}
}
for ( i = 1; i <= G->um; i++)
{
printf("\n请输入有边的2个顶点");
scanf("%d %d",&n,&m);
while(n < 0 || n > G->vexnum || m < 0 || n > G->vexnum)
{
printf("输入的数字不符合要求请重新输入:");
scanf("%d%d",&n,&m);
}
G->arc[n][m].adj = G-
离散数学--最小生成树实验报告 来自淘豆网m.daumloan.com转载请标明出处.