给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v1 v2 ... 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 }
1 #include <iostream> 2 #include <string.h> 3 #include <queue> 4 using namespace std; 5 6 int n,m; 7 int mp[10][10]={0},vis[10]={0}; 8 9 void dfs(int x) 10 { 11 vis[x]=1; 12 cout<<x<<" "; 13 for(int i=0;i<n;i++) 14 { 15 if(mp[x][i]&&!vis[i]) 16 { 17 dfs(i); 18 } 19 } 20 } 21 22 void bfs(int x) 23 { 24 if(!vis[x]) 25 { 26 vis[x]=1; 27 cout<<x<<" "; 28 } 29 queue<int> qe; 30 for(int i=0;i<n;i++) 31 { 32 if(mp[x][i]&&!vis[i]) 33 { 34 qe.push(i); 35 cout<<i<<" "; 36 vis[i]=1; 37 } 38 } 39 while(qe.size()) 40 { 41 int t=qe.front(); 42 bfs(t); 43 qe.pop(); 44 } 45 } 46 47 int main() 48 { 49 cin>>n>>m; 50 int i; 51 for(i=0;i<m;i++) 52 { 53 int a,b; 54 cin>>a>>b; 55 mp[a][b]=mp[b][a]=1; 56 } 57 for(i=0;i<n;i++) 58 { 59 if(!vis[i]) 60 { 61 cout<<"{ "; 62 dfs(i); 63 cout<<"}"<<endl; 64 } 65 } 66 memset(vis,0,sizeof(vis)); 67 for(i=0;i<n;i++) 68 { 69 if(!vis[i]) 70 { 71 cout<<"{ "; 72 bfs(i); 73 cout<<"}"<<endl; 74 } 75 } 76 return 0; 77 }