7-6 列出连通集 (25 分)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v1 v2 … vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
输入样例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
输出样例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
这个题我用c++,图用邻接表存储实现了一遍,又用c,图用邻接矩阵存储实现了一遍。代码如下:
C++版本(邻接表存储)
#include<bits/stdc++.h>
using namespace std;
void DFS(int **arr, bool *flag, int N, int i) {
if (!flag[i]) {
flag[i] = 1;
printf("%d ", i);
}
for (int j = 0; j < N; j++)
if(!flag[j] && arr[i][j])
DFS(arr, flag, N, j);
}
void BFS(int **arr, bool *flag, int N, int i, queue<int> &q) {
q.push(i), flag[i] = 1;
while (!q.empty()) {
printf("%d ", (i = q.front(), i)), q.pop();;
for (int j = 0; j < N; j++) {
if (!flag[j] && arr[i][j]) {
flag[j] = 1;
q.push(j);
}
}
}
}
int main() {
int N, E;
cin >> N >> E;
int **arr = (int**)malloc(sizeof(int*) * N);
for (int i = 0; i < N; i++)
arr[i] = (int*)malloc(sizeof(int) * N);
bool *flag = (bool*)malloc(sizeof(bool) * N);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
arr[i][j] = flag[i] = 0;
for (int k = 0; k < E; k++) {
int i, j;
cin >> i >> j;
arr[i][j] = arr[j][i] = 1;
}
for (int i = 0; i < N; i++) {
if (!flag[i]) {
printf("{ ");
DFS(arr, flag, N, i);
printf("}\n");
}
}
for (int i = 0; i < N; i++)
flag[i] = 0;
queue<int> q;
for (int i = 0; i < N; i++) {
if (!flag[i]) {
printf("{ ");
BFS(arr, flag, N, i, q);
printf("}\n");
}
}
return 0;
}
C版本(邻接矩阵存储):
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct node Node, *List;
struct node {
int data;
List next;
};
void insert(List *L, int x) {
Node *temp = (Node*)malloc(sizeof(Node)), *p = *L, *q = NULL;
temp->data = x;
temp->next = NULL;
if (!*L) {
*L = temp;
return;
}
while(p) {
if (p->data > x) {
if (q) q->next = temp;
else *L = temp;
temp->next = p;
return;
}
q = p, p = p->next;
}
if (!p) q->next = temp;
}
void DFS(List *graph, bool *visited, int N, int i) {
if (!visited[i]) {
printf("%d ", i);
visited[i] = true;
}
Node *p = graph[i];
while(p) {
if (!visited[p->data]) {
DFS(graph, visited, N, p->data);
}
p = p->next;
}
}
void BFS(List *graph, bool *visited, int N, int i) {
int queue[100], front = 0, rear = 0;
queue[rear++] = i, visited[i] = true;
Node *p = graph[i];
while (front != rear) {
printf("%d ", queue[front++]);
while(p) {
if (!visited[p->data])
queue[rear++] = p->data, visited[p->data] = true;
p = p->next;
}
if (front != rear) p = graph[queue[front]];
}
}
int main(){
int N, E;
scanf("%d %d", &N, &E);
List *graph = (List*)malloc(sizeof(List*) * N);
bool *visited = (bool*)malloc(sizeof(bool) * N);
for (int i = 0; i < N; i++) {
graph[i] = NULL;
visited[i] = 0;
}
for (int i = 0; i < E; i++) {
int a, b;
scanf("%d %d", &a, &b);
insert(&graph[a], b), insert(&graph[b], a);
}
for (int i = 0; i < N; i++) {
if (!visited[i]) {
printf("{ ");
DFS(graph, visited, N, i);
printf("}\n");
}
}
for (int i = 0; i < N; i++)
visited[i] = false;
for (int i = 0; i < N; i++) {
if (!visited[i]) {
printf("{ ");
BFS(graph, visited, N, i);
printf("}\n");
}
}
return 0;
}