实验十 图
1、实验目的:
(1)理解图的概念
(2)掌握图的常见存储结构。
(3)理解图的常见操作。
2、实验环境与设备:
已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机。
3、实验原理:
(1)图的邻接矩阵存储。
(2)带权无向图(无向网)的最小生成树实现。
4、实验内容:
(1)实现图的邻接矩阵存储
(2)输出显示图的顶点、边和邻接矩阵
(3)求解图的最小生成树。
#include <stdio.h>
#include <stdlib.h>
// 预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
// 预定义类型
typedef int Status;
// 本程序定义常量
#define INFINITY INT_MAX // 表示最大值无穷大
#define MAX_VERTEX_NUM 20 // 最大顶点个数
// 本程序定义类型
typedef enum{
DG, DN, UDG, UDN } GraphKind; // 图的种类标记{有向图,有向网,无向图,无向网}
typedef int VRType ; // 边的类型,对无权图,用1或0表示相邻否;对带权图,则为权值类型
typedef char VertexType ; // 顶点元素类型
typedef char InfoType ; // 边信息
typedef struct ArcCell // 表示一条边
{
VRType adj; // 边
InfoType *info; // 该边相关信息的指针
}ArcCell, AdjMatrix[ MAX_VERTEX_NUM ][ MAX_VERTEX_NUM ];
typedef struct
{
VertexType vexs[ MAX_VERTEX_NUM ];// 顶点向量,存储顶点信息
AdjMatrix arcs; // 邻接矩阵,存储边
int vexnum; // 图的当前顶点数
int arcnum; // 图的当前边数
GraphKind kind; // 图的种类标记
}MGraph; // 采用邻接矩阵存储的图
typedef struct // 记录从顶点集U到V-U的代价最小的边的辅助数组定义:
{
VertexType adjvex;
VRType lowcost;
}closedge[ MAX_VERTEX_NUM ];
// 算法7.1 采用数组(邻接矩阵)表示法,构造图G。
Status CreateGraph( MGraph *pG ) {
printf( "请输入图的种类(0:有向图;1:有向网;2:无向图;3:无向网):" );
scanf("%d", &pG->kind); // 自定义输入函数,读入一个随机值
switch (pG->kind) {
case DG:
return CreateDG(pG); // 构造有向图G
case DN:
return CreateDN(pG); // 构造有向网G
case UDG:
return CreateUDG(pG); // 构造无向图G
case UDN:
return CreateUDN(pG); // 构造无向网G,算法7.2
default :
return ERROR;
}
} // CreateGraph
// 确定顶点u在G中位置
int LocateVex( MGraph G, VertexType u )
// 算法 7.2,采用数组(邻接矩阵)表示法,构造无向网G。
Status CreateUDN(MGraph *pG)
// 显示网络(包括有向网和无向网)
void DisplayNet( MGraph G )
//在数组minEdge中求非零的最小边
int minimum( closedge minEdge, MGraph G )
// 算法7.9,用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。
void MiniSpanTree_PRIM(MGraph G, VertexType u)
// 主函数
int main( void )
{
MGraph G ;
printf( "请输入一个无向网:\n" );
CreateGraph( &G );
if( G.kind == DG || G.kind == UDG )
DisplayGraph( G );
else
DisplayNet( G );
printf( "该无向网的最小生成树为:\n" );
MiniSpanTree_PRIM( G, '1' ); //从1号顶点(即v1)开始使用普里姆算法求最小生成树
printf( "\n" );
return 0;
}
5、实验考核:
1)完成纸质版实验报告
2)提交电子版作业
6、执行结果示例如下:
构造上述图,程序的参考输入数据如下:
3
6
10
1
2
3
4
5
6
1 2 6
1 3 1
2 3 5
1 4 5
3 4 5
3 6 4
4 6 2
2 5 3
3 5 6
5 6 6
记不清了,代码里好像有bug,只适合这个实验能跑通
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2