一、实验目的
熟悉最小生成树的构造算法,掌握最小生成树的构造过程。
二、实验内容
定义1 设T是一个连通且回路的无向图,则称T为无向树,简称树。树中度数为1的结点称为树叶,度数大于1的结点称为分枝点(或内点)。
定义2设G=<V,E>是一个连通的无向图,若G的某个生成子图是一棵树,则称该树为G的生成树,记为TG。
定义3假定图G是具有n个结点的连通图。对应于G的每一条边e,指定一个正数C(e),把C(e)称作边e的权,(可以是长度、运输量、费用等)。G的生成树也具有一个树权C(T),它是T的所有边权的和。
定义4 在带权的图G的所有生成树中,树权最小的那棵生成树,称作最小生成树。
定理1 (Kruskal) 设图G有n个结点,执行如下步骤
⑴ 选择权最小的边e1,置边数i←1;
⑵ i=n-1结束,否则转⑶;
⑶ 设定已选定e1,e2,…,ei,在G中选取不同于e1,e2,…,ei的边ei+1,使{e1,e2,…,ei,ei+1}无回路且ei+1是满足此条件的权最小的边。
⑷ i←i+1,转⑵。
本实验要求从键盘输入一个赋权图(边权,以矩阵形式输入),求出对应的最小生成树。用C语言或MATLAB实现。
三、实验源程序及结果截图
1.实验源程序:
#include <stdio.h>
typedef struct{
int vex1;//边的起始顶点
int vex2;//边的终止顶点
int weight;//边的权值
}Edge;
int main()
{
int i,j,n,nume=0;
//输入赋权图矩阵,若主对角线不是0或者不是对称矩阵,提示输入错误并结束程序
printf("请输入结点个数:\n");
scanf("%d",&n);
int a[n][n];//边的权值
printf("请输入赋权图矩阵(主对角线为0):\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i]<