列出连通集 (25 分)

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

输入格式:

输入第1行给出2个整数N(0

输出格式:

按照"{ 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 }

题目分析:

标准的DFS和BFS,代码中给出了相应的注释。

代码如下:

#include 
#include 

using namespace std;

int a[11][11];   //建立全局邻接矩阵
int visit[11];   //判断元素是否已经被访问过

void BFS(int n, int v);   //深度优先搜索
void DFS(int n, int v);    //广度优先搜索
int main()
{
    int n, m, i, j, k;

    cin >> n >> m;

    for( i=0; i> j >> k;
		a[j][k] = 1;   //由于是无向图,所以矩阵关于主对角线对称,
		a[k][j] = 1;
    }

    for( i=0; i q;   //利用STL中的queue建队
	int i, j;

	if( visit[v] )   //如果已经被访问了,直接返回
		return;
	else {
		visit[v] = 1;  //没被访问的话,先标记
		q.push(v);    //入队

		while( !q.empty() ) {   //当队列不为空的时候,循环
			j = q.front();   //j要出队
			cout << j << " ";
			q.pop();
			for( i=0; i

 

你可能感兴趣的:(浙大数据结构MOOC题目)