5-6 列出连通集
给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数NN(0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n, m, top, s, e;
int v[1211];
int num[1211];
int ma[1211][1211];
void dfs(int a)//深度优先搜索
{
v[a] = 1;
num[++top] = a;
for(int i=0;i<n;i++)
{
if(ma[a][i]&&v[i]==0)
{
dfs(i);
}
}
}
void bfs(int a)//广度优先搜索
{
v[a] = 1;
int front = 0, rear = 0;
num[rear++] = a;
while(front<rear)
{
int p = num[front++];
for(int i=0;i<n;i++)
{
if(ma[p][i]==1&&v[i]==0)
{
v[i] = 1;
num[rear++] = i;
}
}
}
printf("{");
for(int i=0;i<rear;i++)
printf(" %d", num[i]);
printf(" }\n");
}
int main()
{
scanf("%d %d", &n, &m);
for(int i=0;i<n;i++)//初始化
{
for(int j=0;j<n;j++)
ma[i][j] = 0;
}
for(int i=0;i<m;i++)
{
scanf("%d %d", &s, &e);
ma[s][e] = ma[e][s] = 1;
}
memset(v, 0, sizeof(v));
for(int i=0;i<n;i++)
{
top = -1;
memset(num, 0, sizeof(num));
if(v[i]==0)
dfs(i);
for(int j=0;j<=top;j++)
{
if(j==0)
printf("{ ");
printf("%d ", num[j]);
if(j==top)
printf("}\n");
}
}
memset(v, 0, sizeof(v));//记得清零
for(int i=0;i<n;i++)
{
memset(num, 0, sizeof(num));
if(v[i]==0)
bfs(i);
}
return 0;
}