给定一个有 N 个顶点和E条边的无向图,请用 DFS 和 BFS 分别列出其所有的连通集。假设顶点从 0 到 N-1 编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第 1 行给出 2 个整数 N(0<N≤10)和 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 }
代码:
#include<queue>
#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;
vector<vector<int> >connect(16);
queue<int>list;
int road,spot,from,to,visited[16],i,answer[16],index,temp,c;
void search(int position){
int r;
visited[position]=1;
answer[index++]=position;
for(r=0;r<connect[position].size();r++)if(!visited[connect[position][r]])search(connect[position][r]);
}
int main(){
scanf("%d%d",&spot,&road);
while(road--){
scanf("%d%d",&from,&to);
connect[from].push_back(to);
connect[to].push_back(from);
}
for(i=0;i<spot;i++)sort(connect[i].begin(),connect[i].end());
for(i=0;i<spot;i++)if(!visited[i]){
printf("{");
search(i);
for(c=0;c<index;c++)printf(" %d",answer[c]);
printf(" }\n");
index=0;
}
for(i=0;i<spot;i++)if(visited[i]){
printf("{");
list.push(i);
visited[i]=0;
while(!list.empty()){
temp=list.front();
list.pop();
printf(" %d",temp);
for(c=0;c<connect[temp].size();c++)if(visited[connect[temp][c]]){
list.push(connect[temp][c]);
visited[connect[temp][c]]=0;
}
}
printf(" }\n");
}
return 0;
}