/**
* Copyright(c)
* All rights reserved.
* Author : Sweeney He
* Date : 2021-02-06-09.38.37
* Description : DFS\BFS
*/
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include<queue>
using namespace std;
//图
typedef struct GRAPH
{
int **edge;
int n;
} graph,*Graph;
//DFS
void dfs(Graph g,int*visited,int cur);
//BFS
void bfs(Graph g,int*visited,int cur);
void bfs(Graph g,int*visited,int cur)
{
visited[cur] = 1;
int e;
queue<int> q;
q.push(cur);
while(!q.empty()){
e = q.front();
q.pop();
cout<<e<<" ";
for(int i = 0 ;i<g->n ;i++){
if(g->edge[e][i]==1&&visited[i]==0){
//入队前就必须设置访问标志,否则可能导致某结点多次入队(某个结点与多个结点相连时)
visited[i] = 1;
q.push(i);
}
}
}
return;
}
void dfs(Graph g,int*visited,int cur)
{
visited[cur] = 1;
cout<<cur<<" ";
for(int i = 0 ; i<g->n ; i++)
{
if(g->edge[cur][i]==1&&visited[i]==0)
//访问相邻结点
dfs(g,visited,i);
}
}
int main()
{
int n,m,s,e;
Graph g = new graph();
cin>>n>>m;
//记录每个顶点是否访问
int* visited = new int[n];
memset(visited,0,sizeof(int)*n);
//按需开辟空间
g->edge = new int*[n];
g->n = n;
for(int i = 0 ; i<n ; i++)
{
g->edge[i] = new int[n];
memset(g->edge[i],0,sizeof(int)*n);
}
//输入
for(int i = 0 ; i<m ; i++)
{
cin>>s>>e;
g->edge[s][e] = g->edge[e][s] = 1;
}
//尝试把每个点当作起点DFS
for(int i = 0 ; i<n ; i++)
{
if(visited[i]==0)
{
cout<<"{ ";
dfs(g,visited,i);
cout<<"}"<<endl;
}
}
//BFS
memset(visited,0,sizeof(int)*n);
for(int i = 0 ; i<n; i++)
{
if(visited[i]==0)
{
cout<<"{ ";
bfs(g,visited,i);
cout<<"}"<<endl;
}
}
return 0;
}