给定一个有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 }
Code:
#include <stdio.h>
#define MAXN 10
int visit[MAXN];
int G[MAXN][MAXN];
void DFS( int i, int N ) { //当前顶点数,总顶点数
int j;
visit[i] = 1; //访问当前顶点,标记1
printf(" %d", i); //输出当前顶点
for ( j = 0; j < N; j++ )
if ( !visit[j] && G[i][j] ) //当前下一个顶点未被访问且与当前顶点有边
DFS( j, N );
}
void BFS( int i, int N ) {
int queue[MAXN], rear, front, v, j;
rear = front = -1; //初始化队头队尾
visit[i] = 1;
queue[++rear] = i; //当前顶点入队
while ( front < rear ) {
v = queue[++front];
printf(" %d", v);
for ( j = 0; j < N; j++ ) {
if ( !visit[j] && G[v][j] ) { //下一个顶点没被访问过且和当前顶点有边
visit[j] = 1; //
queue[++rear] = j;
}
}
}
}
int main(void) {
int N, E, i, x, y;
scanf("%d %d", &N, &E); //输入顶点数和边数
for ( i = 0; i < E; i++ ) {
scanf("%d %d", &x, &y);
G[x][y] = G[y][x] = 1; //两个顶点有边,置1
}
for ( i = 0; i < MAXN; i++ ) //visit[]置零
visit[i] = 0;
for ( i = 0; i < N; i++ ) {
if ( !visit[i] ) { //若当前顶点没被访问过
printf("{");
DFS( i, N ); //传入当前顶点数、总顶点数
printf(" }\n");
}
}
for ( i = 0; i < MAXN; i++ ) //visit[]置零
visit[i] = 0;
for ( i = 0; i < N; i++ ) {
if ( !visit[i] ) {
printf("{");
BFS( i, N );
printf(" }\n");
}
}
return 0;
}