C# · 12月 20, 2021

数据结构-列出联通集

7-39 列出连通集 (25 分)

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照”{ v​1​​ v​2​​ … v​k​​ }”的格式,每行输出一个连通集。先输出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

#include

#include

#include

#include@H_301_65@

using namespace std;

int n,e;

int mapp[21][21];

int vis[21];

void DFS(int i)

{

vis[i]=1;

printf(“%d “,i);

for(int j=0;j<n;j++)

if(!vis[j]&&mapp[i][j])

DFS(j);

}

void BFS(int i)

{

queue Q;

Q.push(i);

vis[i]=1;

while(!Q.empty())

{

int cnt = Q.front();

printf(“%d “,cnt);

Q.pop();

for(int j=0;j<n;j++)

{

if(!vis[j]&&mapp[cnt][j])

{

vis[j]=1;

Q.push(j);

}

}

}

}

int main()

{

scanf(“%d %d”,&n,&e);

int x,y;

for(int i=0;i<e;i++)

{

int x,y;

scanf(“%d%d”,&x,&y);

mapp[x][y]=mapp[y][x]=1;

}

for(int i=0;i<n;i++)

{

if(!vis[i])

{

printf(“{ “);

DFS(i);

printf(“}n”);

}

}

memset(vis,sizeof(vis));

for(int i=0;i<n;i++)

{

if(!vis[i])

{

printf(“{ “);

BFS(i);

printf(“}n”);

}

}

}