这是一个图的遍历及连通性问题。我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历整个图,查看是否存在未访问到的结点。如果存在未访问到的结点,则说明该图不连通。
下面是基于DFS实现的代码示例:
#include <stdio.h>
#define MAXN 100
int A[MAXN][MAXN]; // 存储邻接矩阵
int visited[MAXN]; // 记录结点是否已经被访问
// 参数n为结点总数,u为当前遍历到的结点
void dfs(int n, int u) {
visited[u] = 1; // 标记结点u已经被访问过了
for (int v = 0; v < n; v++) {
if (A[u][v] == 1 && visited[v] == 0) { // 如果u和v有边相连并且v未被访问过
dfs(n, v); // 递归访问结点v
}
}
}
int main() {
int n;
scanf("%d", &n);
// 读入邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &A[i][j]);
}
}
// 访问结点0,查看整个图的连通性
dfs(n, 0);
// 判断是否存在未被访问的结点
int flag = 1;
for (int i = 0; i < n; i++) {
if (visited[i] == 0) {
flag = 0;
break;
}
}
if (flag) {
printf("YES\n");
} else {
printf("NO\n");
}
return 0;
}
该程序从结点0开始遍历整个图,标记已经被访问到的结点。遍历结束后,判断是否存在未被标记的结点即可得出结论。
时间复杂度:该算法的时间复杂度为 $O(n^2)$,其中n为结点总数,因为需要遍历整个邻接矩阵。