设计一个程序,依次从有向图中的每个顶点深度优先搜索遍历操作;邻接矩阵作为存储结构。算法思想: (1) 定义图的顺序存储结构; (2) 创建有向图,采用邻接矩阵表示(调用CreateDG函数实现),具体实现如下: 输入图的顶点数和边数; 依次输入顶点的信息存入顶点表中; 初始化邻接矩阵,使每个权值初始化为0; 构造邻接矩阵;(需调用LocateVex函数获取顶点在顶点表中的下标) (3) 依次从每个顶点进行深度优先搜索,并输出访问序列(调用DFSTraverse函数实现;另需调用相关函数实现获取第一个和下一个邻接点的操作)。 注意:顶点数据仅为1个数字或1个字符。 输入说明: 第一行输入图的顶点数n和边数m; 第二行依次输入n个顶点的数据; 接下来m行的每行输入一条边的信息。 输出说明: 输出n行,每行输出从第i(0≤i<n)个顶点深度优先搜索的访问序列,序列中的连通分量用{}括起来,无空格间隔,{}为英文半角的符号。使用c++实现,并给出完整代码
时间: 2023-11-22 09:54:06 浏览: 52
以下是C++实现的完整代码:
```
#include <iostream>
using namespace std;
const int MAXV = 100; // 最大顶点数
const int INF = 0x3f3f3f3f; // 无穷大
typedef struct {
int vex[MAXV]; // 存放顶点信息
int edge[MAXV][MAXV]; // 存放邻接矩阵
int vexnum, edgenum; // 顶点数和边数
} MGraph;
// 获取顶点在顶点表中的下标
int LocateVex(MGraph g, int v) {
for (int i = 0; i < g.vexnum; i++) {
if (g.vex[i] == v)
return i;
}
return -1;
}
// 创建有向图
void CreateDG(MGraph &g) {
cout << "请输入图的顶点数和边数:" << endl;
cin >> g.vexnum >> g.edgenum;
cout << "请输入" << g.vexnum << "个顶点的数据:" << endl;
for (int i = 0; i < g.vexnum; i++) {
cin >> g.vex[i];
}
// 初始化邻接矩阵
for (int i = 0; i < g.vexnum; i++) {
for (int j = 0; j < g.vexnum; j++) {
g.edge[i][j] = INF;
}
}
// 构造邻接矩阵
int v1, v2;
for (int i = 0; i < g.edgenum; i++) {
cout << "请输入第" << i+1 << "条边的两个顶点:" << endl;
cin >> v1 >> v2;
int index1 = LocateVex(g, v1);
int index2 = LocateVex(g, v2);
g.edge[index1][index2] = 1; // 表示有一条边从顶点v1指向顶点v2
}
}
// 获取第一个邻接点
int FirstAdjVex(MGraph g, int v) {
for (int i = 0; i < g.vexnum; i++) {
if (g.edge[v][i] != INF)
return i;
}
return -1;
}
// 获取下一个邻接点
int NextAdjVex(MGraph g, int v, int w) {
for (int i = w+1; i < g.vexnum; i++) {
if (g.edge[v][i] != INF)
return i;
}
return -1;
}
// 深度优先遍历
void DFS(MGraph g, int v, bool visited[]) {
visited[v] = true;
cout << g.vex[v]; // 输出访问的顶点
int w = FirstAdjVex(g, v); // 获取第一个邻接点
while (w != -1) {
if (!visited[w])
DFS(g, w, visited);
w = NextAdjVex(g, v, w); // 获取下一个邻接点
}
}
// 深度优先遍历主函数
void DFSTraverse(MGraph g) {
bool visited[MAXV];
for (int i = 0; i < g.vexnum; i++)
visited[i] = false;
for (int i = 0; i < g.vexnum; i++) {
if (!visited[i]) {
cout << "{";
DFS(g, i, visited);
cout << "}" << endl;
}
}
}
int main() {
MGraph g;
CreateDG(g);
DFSTraverse(g);
return 0;
}
```
输入样例:
```
6 8
0 1 2 3 4 5
0 1
0 2
1 3
2 1
2 4
3 4
4 3
5 4
```
输出样例:
```
{02341}
{5}
```