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

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

输入格式:

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

输出格式:

按照\"{ v​1​​ v​2​​ ... 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<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm> 
#include<queue>
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<int> 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,0,sizeof(vis)); 
	for(int i=0;i<n;i++)
	{ 
		if(!vis[i])
		{ 
		printf(\"{ \"); 
		BFS(i); 
		printf(\"}\\n\"); 
		} 
	} 
} 

 

收藏 打印