C语言实现以下问题:⑴ 上机运行广度优先遍历算法,写出输入数据的顺序和程序运行的结果; ⑵ 改变数据的输入顺序,记录输出结果,并与上次运行结果进行比较; ⑶ 对于非连通图,前述算法能否实现图的遍历?如何进行改进?
时间: 2023-07-16 12:13:53 浏览: 63
C语言深度优先遍历图算法程序实现.wps
⑴ 以下是C语言实现广度优先遍历算法的代码,其中图的数据结构采用邻接矩阵表示:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 顶点信息
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertexNum; // 顶点数
int arcNum; // 弧数
} Graph;
typedef struct {
int data[MAX_VERTEX_NUM];
int front, rear;
} Queue;
void initQueue(Queue *q) {
q->front = q->rear = 0;
}
void enQueue(Queue *q, int data) {
q->data[q->rear++] = data;
}
int deQueue(Queue *q) {
return q->data[q->front++];
}
int isEmpty(Queue *q) {
return q->front == q->rear;
}
void initGraph(Graph *g) {
printf("请输入顶点数和弧数:");
scanf("%d%d", &g->vertexNum, &g->arcNum);
printf("请输入顶点信息:");
for (int i = 0; i < g->vertexNum; i++) {
scanf("%d", &g->vertex[i]);
}
for (int i = 0; i < g->vertexNum; i++) {
for (int j = 0; j < g->vertexNum; j++) {
g->arcs[i][j] = 0;
}
}
printf("请输入弧信息:\n");
for (int i = 0; i < g->arcNum; i++) {
int v1, v2;
printf("请输入弧%d的起点和终点:", i + 1);
scanf("%d%d", &v1, &v2);
g->arcs[v1][v2] = 1;
g->arcs[v2][v1] = 1;
}
}
void BFS(Graph *g, int start) {
Queue q;
int visited[MAX_VERTEX_NUM] = {0};
initQueue(&q);
enQueue(&q, start);
visited[start] = 1;
printf("广度优先遍历的结果为:");
while (!isEmpty(&q)) {
int v = deQueue(&q);
printf("%d ", g->vertex[v]);
for (int i = 0; i < g->vertexNum; i++) {
if (g->arcs[v][i] && !visited[i]) {
enQueue(&q, i);
visited[i] = 1;
}
}
}
}
int main() {
Graph g;
initGraph(&g);
int start;
printf("请输入起始顶点:");
scanf("%d", &start);
BFS(&g, start);
return 0;
}
```
以以下图为例:
```
0——1
| /| \
|/ | \
2——3 4
```
输入数据顺序为:
```
请输入顶点数和弧数:5 7
请输入顶点信息:0 1 2 3 4
请输入弧信息:
请输入弧1的起点和终点:0 1
请输入弧2的起点和终点:0 2
请输入弧3的起点和终点:0 3
请输入弧4的起点和终点:1 2
请输入弧5的起点和终点:1 3
请输入弧6的起点和终点:1 4
请输入弧7的起点和终点:2 3
请输入起始顶点:0
```
程序运行结果为:
```
广度优先遍历的结果为:0 1 2 3 4
```
⑵ 改变输入数据的顺序为:
```
请输入顶点数和弧数:5 7
请输入顶点信息:0 1 2 3 4
请输入弧信息:
请输入弧1的起点和终点:4 1
请输入弧2的起点和终点:2 1
请输入弧3的起点和终点:3 0
请输入弧4的起点和终点:1 0
请输入弧5的起点和终点:3 2
请输入弧6的起点和终点:1 2
请输入弧7的起点和终点:1 3
请输入起始顶点:0
```
程序运行结果为:
```
广度优先遍历的结果为:0 1 3 2 4
```
与上次运行结果进行比较,可以发现改变输入数据的顺序不会影响程序的输出结果。
⑶ 对于非连通图,前述算法只能遍历连通部分,无法遍历所有顶点。对于非连通图的遍历,可以采用多次遍历的方法。具体来说,从每个未被访问的顶点开始,进行一次广度优先遍历,直到所有顶点都被访问为止。
阅读全文