C语言以邻接矩阵和邻接表的方式存储连通图。然后分别用深度优先算法和广度优先算法遍历该连通图。
时间: 2023-11-27 12:51:12 浏览: 132
邻接矩阵和邻接表都是图的存储结构,邻接矩阵适合表示稠密图,邻接表适合表示稀疏图。
1. 邻接矩阵
邻接矩阵是一个二维数组,用于表示图中每个顶点之间的关系。如果顶点 i 和顶点 j 之间有一条边,则邻接矩阵中第 i 行,第 j 列和第 j 行,第 i 列的值都为 1。如果没有边相连,则值为 0。
下面是用邻接矩阵表示的连通图:
```
1 2 3 4
-------------
1 | 0 1 1 1
2 | 1 0 1 0
3 | 1 1 0 1
4 | 1 0 1 0
```
2. 邻接表
邻接表是由所有顶点的链表组成,每个顶点的链表中存储了与该顶点相连的所有顶点。每个链表中的节点包含两个字段,一个是该节点的值,另一个是指向下一个节点的指针。
下面是用邻接表表示的连通图:
```
1 -> 2 -> 3 -> 4
2 -> 1 -> 3
3 -> 1 -> 2 -> 4
4 -> 1 -> 3
```
3. 深度优先算法
深度优先算法是一种遍历图的算法,它从某个顶点开始遍历,沿着一条路径一直走到底,直到不能再走为止,然后返回上一个节点继续走其他路径,直到遍历完整个图。
深度优先算法可以用递归实现,也可以用栈实现。下面是用递归实现的深度优先遍历算法:
```c
void dfs(int v, int visited[], int graph[][MAX], int n) {
visited[v] = 1;
printf("%d ", v);
for (int i = 1; i <= n; i++) {
if (graph[v][i] == 1 && visited[i] == 0) {
dfs(i, visited, graph, n);
}
}
}
```
其中,v 表示当前遍历的顶点,visited 数组用来记录每个顶点是否已经被访问过,graph 是邻接矩阵或邻接表,n 表示图中的顶点数。
4. 广度优先算法
广度优先算法也是一种遍历图的算法,它从某个顶点开始,先访问它的所有邻居节点,再访问邻居节点的邻居节点,以此类推,直到遍历完整个图。
广度优先算法可以用队列实现。下面是用队列实现的广度优先遍历算法:
```c
void bfs(int v, int visited[], int graph[][MAX], int n) {
int queue[MAX], front = 0, rear = 0;
visited[v] = 1;
queue[++rear] = v;
while (front != rear) {
v = queue[++front];
printf("%d ", v);
for (int i = 1; i <= n; i++) {
if (graph[v][i] == 1 && visited[i] == 0) {
visited[i] = 1;
queue[++rear] = i;
}
}
}
}
```
其中,v 表示当前遍历的顶点,visited 数组用来记录每个顶点是否已经被访问过,graph 是邻接矩阵或邻接表,n 表示图中的顶点数。queue 数组用来存储要遍历的顶点,front 和 rear 分别表示队列的前端和后端。
阅读全文