C语言设计一个算法,判断无向图G是否连通。若连通返回1,否则返回0。
时间: 2023-07-15 22:11:45 浏览: 267
可以使用深度优先搜索或广度优先搜索来判断无向图是否连通。
具体算法如下:
1. 从图中任意一个节点开始,进行深度优先搜索或广度优先搜索。
2. 如果搜索到的节点数等于图中节点总数,则说明该图是连通的,返回1。
3. 如果搜索到的节点数小于图中节点总数,则说明该图不是连通的,返回0。
下面是使用深度优先搜索的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX 100
int visited[MAX_VERTEX]; // 标记节点是否已经被访问过
typedef struct {
int data[MAX_VERTEX]; // 存储节点信息
int edges[MAX_VERTEX][MAX_VERTEX]; // 存储边的信息
int vertex_num; // 节点数
int edge_num; // 边数
} Graph;
void dfs(Graph *g, int v) {
visited[v] = 1;
for (int i = 0; i < g->vertex_num; i++) {
if (g->edges[v][i] && !visited[i]) { // 如果有连接且未被访问
dfs(g, i);
}
}
}
int is_connected(Graph *g) {
for (int i = 0; i < g->vertex_num; i++) {
visited[i] = 0;
}
dfs(g, 0);
for (int i = 0; i < g->vertex_num; i++) {
if (!visited[i]) { // 存在未被访问的节点
return 0;
}
}
return 1;
}
int main() {
Graph g = {
{0, 1, 2, 3, 4},
{
{0, 1, 1, 0, 0},
{1, 0, 0, 1, 0},
{1, 0, 0, 1, 0},
{0, 1, 1, 0, 1},
{0, 0, 0, 1, 0}
},
5,
7
};
if (is_connected(&g)) {
printf("The graph is connected.\n");
} else {
printf("The graph is not connected.\n");
}
return 0;
}
```
这里使用邻接矩阵来存储图的信息,时间复杂度为O(V^2),其中V为节点数。可以使用其他数据结构来存储图的信息,以提高算法效率。
阅读全文