C语言根据输入的无向图的邻接矩阵A,判断此图的连通分量的个数。请使用邻接矩阵的存储结构创建图的存储,并采用BFS遍历算法实现,否则不得分。 【输入形式】 第一行为图的结点个数n,之后的n行为邻接矩阵的内容,每行n个数表示。其中A[i][j]=1表示两个结点邻接,而A[i][j]=0表示两个结点无邻接关系。 【输出形式】 输出此图连通分量的个数。
时间: 2023-06-27 18:04:54 浏览: 116
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
#define QUEUE_SIZE 100
int A[MAXN][MAXN]; // 邻接矩阵
int visited[MAXN]; // 记录结点是否被访问过
// 定义队列结构体
struct Queue {
int data[QUEUE_SIZE];
int front;
int rear;
};
// 初始化队列
void initQueue(struct Queue *q) {
q->front = 0;
q->rear = 0;
}
// 判断队列是否为空
int isQueueEmpty(struct Queue *q) {
return q->front == q->rear;
}
// 入队
void enqueue(struct Queue *q, int x) {
if ((q->rear + 1) % QUEUE_SIZE == q->front) {
printf("Queue is full!\n");
exit(1);
}
q->data[q->rear] = x;
q->rear = (q->rear + 1) % QUEUE_SIZE;
}
// 出队
int dequeue(struct Queue *q) {
if (isQueueEmpty(q)) {
printf("Queue is empty!\n");
exit(1);
}
int x = q->data[q->front];
q->front = (q->front + 1) % QUEUE_SIZE;
return x;
}
// BFS遍历连通分量
void BFS(int v, int n) {
struct Queue q;
initQueue(&q);
visited[v] = 1; // 标记结点v已被访问
enqueue(&q, v); // 将结点v入队
while (!isQueueEmpty(&q)) {
int u = dequeue(&q); // 取出队头结点
for (int i = 0; i < n; i++) {
if (A[u][i] && !visited[i]) { // 如果结点i与结点u相邻且未被访问
visited[i] = 1; // 标记结点i已被访问
enqueue(&q, i); // 将结点i入队
}
}
}
}
// 统计连通分量的个数
int countConnectedComponents(int n) {
int count = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) { // 如果结点i未被访问
count++; // 连通分量个数加1
BFS(i, n); // 遍历结点i所在的连通分量
}
}
return count;
}
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]);
}
}
printf("The number of connected components is %d.\n", countConnectedComponents(n));
return 0;
}
```
代码中使用了邻接矩阵存储图,用visited数组记录每个结点是否被访问过。BFS遍历连通分量时,使用了队列数据结构。最后统计连通分量的个数,即为所求。
阅读全文