题目来源:中国大学MOOC-陈越、何钦铭-数据结构-2018春
作者: 陈越
单位: 浙江大学
问题描述:
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=11;
int G[maxn][maxn];
int visited[maxn];
int M,N;//结点,边
void DFS(int start)
{
visited[start]=1;
cout<<start<<" ";
for(int i=0;i<M;i++)
{
if(visited[i]==0&&G[start][i]==1)
{
DFS(i);
}
}
return;
}
void BFS(int start)
{
queue<int> bfsQueue;
bfsQueue.push(start);
visited[start]=1;
while(!bfsQueue.empty())
{
int num=bfsQueue.front();
bfsQueue.pop();
cout<<num<<" ";
for(int j=0;j<M;j++)
{
if(G[num][j]==1)
{
if(visited[j]==0)
{
bfsQueue.push(j);
visited[j]=1;
}
}
}
}
}
int main()
{
fill(G[0],G[0]+maxn*maxn,0);
fill(visited,visited+maxn,0);
cin>>M>>N;
for(int i=1;i<=N;i++)
{
int node1,node2;
cin>>node1>>node2;
G[node1][node2]=G[node2][node1]=1;
}
for(int i=0;i<M;i++)
{
if(visited[i]==0)
{
cout<<"{ ";
DFS(i);
cout<<"}"<<endl;
}
}
fill(visited,visited+maxn,0);
for(int i=0;i<M;i++)
{
if(visited[i]==0)
{
cout<<"{ ";
BFS(i);
cout<<"}"<<endl;
}
}
return 0;
}