给定一个有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 }
代码长度限制
16 KB
时间限制
400 ms
内存限制
代码:
#include <iostream>
#include <vector>
#define MAX 100
using namespace std;
struct Graph{
int V;
int E[MAX][MAX];
};
typedef struct Graph G;
//DFS
int st[MAX];
int st1[MAX];
void DFS(G A,int v){
if(st[v]==0){
st[v]=1;
printf("%d ",v);
}
for(int i=0;i<A.V;i++){
if(st[i]!=1){
if(A.E[v][i]==1){
DFS(A,i);
}
}
}
}
void BFS(G A,int t) {
int v;
int que[MAX], front = 0, rear = -1;
v = que[++rear] = t; // 从节点 0 开始遍历
//st1[v] = 1; // 标记为已经访问过的
while (front <= rear) {
v = que[front++];
if(st1[v]==0) cout << v << " ";
st1[v] = 1;
for (int i = 0; i < A.V; ++i) {
if (st1[i] != 1 && A.E[v][i] == 1) {
// 标记为已经访问过的
que[++rear] = i;
}
}
}
}
int main(){
G A;
for(int i=0;i<MAX;i++){
for(int j=0;j<MAX;j++){
A.E[i][j]=0;
}
}
int v,e;
int v1,v2;
cin>>v>>e;
A.V=v;
for(int i=1;i<=e;i++){
cin>>v1>>v2;
A.E[v1][v2]=1;
A.E[v2][v1]=1;
}
for(int i=0;i<v;i++){
if(st[i]!=1){
printf("{ ");
DFS(A,i);
printf("}\n");
}
}
for(int i=0;i<v;i++){
if(st1[i]!=1){
printf("{ ");
BFS(A,i);
printf("}\n");
}
}
}