这个代码指的是输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输出图及遍历结果
时间: 2024-05-15 15:14:31 浏览: 174
好的,那我可以给您讲解一下这个代码的实现方法。
首先我们需要定义一个图的结构体,保存图的信息,包括顶点数、边数、邻接矩阵等。
```c++
#define MAX_VERTEX_NUM 100 // 图中最大顶点数
#define INFINITY 65535 // 用65535代表无穷大
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存储顶点信息
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边信息,用邻接矩阵表示
int vertex_num; // 顶点数
int edge_num; // 边数
} Graph;
```
然后我们可以根据用户输入的信息来构建图,这里以无向图为例。
```c++
void Create(Graph* G) {
printf("请输入图的类型:\n");
printf("1. 无向图\n");
printf("2. 有向图\n");
printf("3. 无向网\n");
printf("4. 有向网\n");
scanf("%d", &G->type);
printf("请输入顶点数和边数:\n");
scanf("%d %d", &G->vertex_num, &G->edge_num);
for (int i = 0; i < G->vertex_num; i++) {
printf("请输入第%d个顶点的信息:\n", i + 1);
scanf("%d", &G->vertex[i]);
}
// 初始化邻接矩阵
for (int i = 0; i < G->vertex_num; i++) {
for (int j = 0; j < G->vertex_num; j++) {
G->edge[i][j] = INFINITY;
}
}
// 构建边
int v1, v2, w;
for (int i = 0; i < G->edge_num; i++) {
printf("请输入第%d条边的信息:\n", i + 1);
scanf("%d %d %d", &v1, &v2, &w);
G->edge[v1 - 1][v2 - 1] = w;
if (G->type == 1) {
G->edge[v2 - 1][v1 - 1] = w;
}
}
}
```
接着我们可以实现深度优先搜索和广度优先搜索遍历图的算法。
深度优先搜索:
```c++
void DFS(Graph* G, int v, bool* visited) {
visited[v] = true;
printf("%d ", G->vertex[v]);
for (int i = 0; i < G->vertex_num; i++) {
if (G->edge[v][i] != INFINITY && !visited[i]) {
DFS(G, i, visited);
}
}
}
void DFSTraverse(Graph* G) {
bool visited[MAX_VERTEX_NUM];
memset(visited, false, sizeof(visited));
printf("DFS遍历结果:\n");
for (int i = 0; i < G->vertex_num; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
printf("\n");
}
```
广度优先搜索:
```c++
void BFSTraverse(Graph* G) {
bool visited[MAX_VERTEX_NUM];
memset(visited, false, sizeof(visited));
queue<int> q;
printf("BFS遍历结果:\n");
for (int i = 0; i < G->vertex_num; i++) {
if (!visited[i]) {
visited[i] = true;
printf("%d ", G->vertex[i]);
q.push(i);
while (!q.empty()) {
int v = q.front();
q.pop();
for (int j = 0; j < G->vertex_num; j++) {
if (G->edge[v][j] != INFINITY && !visited[j]) {
visited[j] = true;
printf("%d ", G->vertex[j]);
q.push(j);
}
}
}
}
}
printf("\n");
}
```
最后我们可以按照要求输出图及遍历结果。
```c++
void Print(Graph* G) {
printf("顶点信息:\n");
for (int i = 0; i < G->vertex_num; i++) {
printf("%d ", G->vertex[i]);
}
printf("\n");
printf("邻接矩阵:\n");
for (int i = 0; i < G->vertex_num; i++) {
for (int j = 0; j < G->vertex_num; j++) {
printf("%d ", G->edge[i][j]);
}
printf("\n");
}
}
int main() {
Graph G;
Create(&G);
Print(&G);
DFSTraverse(&G);
BFSTraverse(&G);
return 0;
}
```
这样,就实现了输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图,并按深度优先搜索和广度优先搜索遍历图,按某种形式输出图及遍历结果的代码。
阅读全文