一、题目
编制一个演示用邻接矩阵和邻接表存储结构实现的图的深度优先遍历和广度优先遍历算法的程序。另附扩展实现(1:有向图2:无向图3:有向网4:无向网) 4种类型的图的(1.邻接矩阵,2.邻接表,3.深度优先搜索,4.广度优先搜索,5.最小生成树,6.拓扑排序,7.关键路径,8.从某个源点到其余各顶点的最短路径,9.每一对顶点之间的最短路径)图的9种实现程序。(附源代码于尾页//程序1 //程序2 /*扩展实现源代码*/)
二、需求分析
本程序在Windows环境下用用Visual C++编写,完成程序1和程序2的实现:
程序1
void CreatMatrix(adjmatrix GA) // 建立图的邻接矩阵
void DfsMatrix(adjmatrix GA,int v) // 从初始点v出发深度优先遍历邻接矩阵GA表示的图
void BfsMatrix(adjmatrix GA,int v) // 从初始点v出发广度优先遍历邻接矩阵GA表示的图
程序2
void CreatAdjlist(AdjList GL) //建立图的邻接表
void DfsAdjlist(AdjList GL,int v) //从初始点v出发深度优先遍历邻接表GL表示的图
void BfsAdjlist(AdjList GL,int v) //从初始点v出发广度优先遍历邻接表GL表示的图
三、概要设计
程序1
/* 定义邻接矩阵类型 */
typedef int adjmatrix[n+1][n+1];
程序2
/* 邻接表的结点类型 */
typedef struct arc
{
int adjvex;
struct arc *next;}ArcNode;
typedef struct VexNode
{
int vertex;
ArcNode *firstarc;
}VerNode;
typedef VerNode AdjList[MAXNODE];
三、详细设计
分别对程序1和程序2进行编码设计如下:
//程序1
#include <stdio.h>
#define n 5
#define MAXSIZE 10 //广度优先遍历时所使用的队列的最大容量
#define MaxNum 10000 //定义一个最大数
// 定义邻接矩阵类型
typedef int adjmatrix[n+1][n+1]; // 0号单元没用
int visited[n+1]; // 0号单元没用
int arcnum; //边的个数
//建立图的邻接矩阵
//程序2
#include <stdio.h>
#include <malloc.h>
#define MAXNODE 10
#define NULL 0
typedef struct arc
{
int adjvex;
struct arc *next;
}ArcNode;
typedef struct VexNode
{
int vertex;
ArcNode *firstarc;
}VerNode;
typedef VerNode AdjList[MAXNODE];
int visited[MAXNODE];
int vexnum,arcnum;
// 建立图的邻接表
2)图的基本操作如下:
//程序1
//建立图的邻接矩阵
void CreatMatrix(adjmatrix GA)
//从初始点v出发深度优先搜索邻接矩阵GA表示的图
void DfsMatrix(adjmatrix GA,int v)
//从初始点v出发广度优先搜索邻接矩阵GA表示的图
void BfsMatrix(adjmatrix GA,int v)
//程序2
// 建立图的邻接表