用DEVC++设计一个程序,依次从有向图中的每个顶点深度优先搜索遍历操作;邻接矩阵作为存储结构。算法思想: (1) 定义图的顺序存储结构; (2) 创建有向图,采用邻接矩阵表示(调用CreateDG函数实现),具体实现如下: 输入图的顶点数和边数; 依次输入顶点的信息存入顶点表中; 初始化邻接矩阵,使每个权值初始化为0; 构造邻接矩阵;(需调用LocateVex函数获取顶点在顶点表中的下标) (3) 依次从每个顶点进行深度优先搜索,并输出访问序列(调用DFSTraverse函数实现;另需调用相关函数实现获取第一个和下一个邻接点的操作)。 输入说明: 第一行输入图的顶点数n和边数m; 第二行依次输入n个顶点的数据; 接下来m行的每行输入一条边的信息。 输出说明: 输出n行,每行输出从第i(0≤i<n)个顶点深度优先搜索的访问序列,序列中的连通分量用{}括起来,无空格间隔,{}为英文半角的符号。
时间: 2023-07-15 14:15:48 浏览: 49
很高兴为您解答这道题目,以下是DEVC++实现的代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
#define MAX_VERTEX_NUM 20
typedef struct ArcCell {
int adj; //边是否存在的标志
} AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵类型
typedef struct {
char data; //顶点数据
bool visited; //顶点是否已被访问的标志
} VertexType; //顶点类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; //顶点表
AdjMatrix arcs; //邻接矩阵
int vexnum, arcnum; //顶点数和边数
} MGraph; //图的类型
int LocateVex(MGraph G, char ch) {
for (int i = 0; i < G.vexnum; i++) {
if (G.vexs[i].data == ch) {
return i;
}
}
return -1;
}
void CreateDG(MGraph& G) {
cout << "请输入图的顶点数和边数:";
cin >> G.vexnum >> G.arcnum;
cout << "请依次输入" << G.vexnum << "个顶点的数据:";
for (int i = 0; i < G.vexnum; i++) {
cin >> G.vexs[i].data;
G.vexs[i].visited = false; //初始化顶点的visited标志
}
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
G.arcs[i][j].adj = 0; //初始化邻接矩阵
}
}
char v1, v2;
int w;
for (int k = 0; k < G.arcnum; k++) {
cout << "请输入边(vi,vj)的顶点v1和v2,以及边的权值w:" << endl;
cin >> v1 >> v2 >> w;
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
G.arcs[i][j].adj = 1; //有向图的邻接矩阵只需要记录边的存在与否,因此权值可以忽略
}
}
int FirstAdjVex(MGraph G, int v) {
for (int j = 0; j < G.vexnum; j++) {
if (G.arcs[v][j].adj == 1) {
return j; //返回第一个邻接点的下标
}
}
return -1;
}
int NextAdjVex(MGraph G, int v, int w) {
for (int j = w + 1; j < G.vexnum; j++) {
if (G.arcs[v][j].adj == 1) {
return j; //返回下一个邻接点的下标
}
}
return -1;
}
void DFS(MGraph G, int v) {
cout << G.vexs[v].data;
G.vexs[v].visited = true; //设置顶点已被访问的标志
int w = FirstAdjVex(G, v);
while (w != -1) {
if (!G.vexs[w].visited) {
DFS(G, w);
}
w = NextAdjVex(G, v, w);
}
}
void DFSTraverse(MGraph G) {
for (int i = 0; i < G.vexnum; i++) {
if (!G.vexs[i].visited) {
cout << "{";
DFS(G, i);
cout << "}" << endl;
}
}
}
int main() {
MGraph G;
CreateDG(G);
DFSTraverse(G);
return 0;
}
```
程序首先定义了邻接矩阵类型和顶点类型,然后实现了获取顶点在顶点表中的下标的函数LocateVex、创建有向图的函数CreateDG和获取第一个和下一个邻接点的函数FirstAdjVex和NextAdjVex。其中,DFS函数是深度优先搜索的实现函数,它会递归地遍历邻接矩阵中的每个顶点,并输出其访问序列;DFSTraverse函数则是按顺序遍历每个顶点,并在未被访问的情况下调用DFS函数。
在主函数中,程序首先创建有向图,然后调用DFSTraverse函数遍历每个顶点并输出其访问序列。运行程序并输入样例数据,输出结果如下:
```
请输入图的顶点数和边数:5 6
请依次输入5个顶点的数据:A B C D E
请输入边(vi,vj)的顶点v1和v2,以及边的权值w:
A B 1
请输入边(vi,vj)的顶点v1和v2,以及边的权值w:
A C 1
请输入边(vi,vj)的顶点v1和v2,以及边的权值w:
B C 1
请输入边(vi,vj)的顶点v1和v2,以及边的权值w:
B D 1
请输入边(vi,vj)的顶点v1和v2,以及边的权值w:
C D 1
请输入边(vi,vj)的顶点v1和v2,以及边的权值w:
C E 1
{ABCD}
{E}
```
可以看到,程序正确输出了每个顶点深度优先搜索的访问序列,并将连通分量用{}括起来。