版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Authur520/article/details/85052183
给定一个有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 }
代码实现为:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 15
#define TRUE 1
#define FALSE 0
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
int Nv,Ne;
int G[MAXN][MAXN];
Vertex Visited[MAXN] = {FALSE};
void BuildGraph();
void DFS(Vertex V);
void BFS (Vertex S);
int main()
{
Vertex W;
BuildGraph();
for(W=0; W<Nv; W++){
if( !Visited[W] ){//若W顶点未被访问过
printf("{ ");
DFS(W);
printf("}\n");
}
}
memset(Visited,0,sizeof(Visited));
for(W=0; W<Nv; W++){
if( !Visited[W] ){//若W顶点未被访问过
printf("{ ");
BFS(W);
printf("}\n");
}
}
return 0;
}
void BuildGraph()
{
int i,j;
int v1,v2;
scanf("%d",&Nv);
for(i=0; i<Nv; i++)
for(j=0; j<Nv; j++)
G[i][j] = 0;
scanf("%d",&Ne);
for(i=0; i<Ne; i++){
scanf("%d %d",&v1,&v2);
G[v1][v2] = 1;
G[v2][v1] = 1;
}
}
void DFS(Vertex V)
{/* 以V为出发点对邻接矩阵存储的图G进行DFS搜索 */
Vertex W;
printf("%d ", V); /*访问第V个顶点 */
Visited[V] = TRUE; /*标记V已访问 */
for(W=0; W<Nv; W++){
if( G[V][W] != 0){ /* 对V的每个邻接点W */
if( !Visited[W] ){ //若W未被访问过
DFS(W); /* 则递归访问之 */
}
}
}
}
void BFS (Vertex S)
{ /*以S为出发点对邻接矩阵存储的图G进行BFS搜索 */
Vertex V, W;
Vertex s[MAXN]; //顶点队列
int head = 0,tail = 0;
printf("%d ", S); /*访问第V个顶点 */
Visited[S] = TRUE; /* 标记S已访问 */
s[tail++] = S;
while ( head < tail ) { //队列不为空时
V = s[head++]; /* 弹出V */
for(W=0; W<Nv; W++) /* 对图中的每个顶点W */
/* 若W是V的邻接点并且未访问过 */
if ( !Visited[W] && G[V][W] ){
/* 访问顶点W */
printf("%d ", W); /*访问第V个顶点 */
Visited[W] = TRUE; /* 标记W已访问 */
s[tail++] = W; /* W入队列 */
}
} /* while结束*/
}