题目描述:
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0
#include<iostream>
using namespace std;
#define MaxSize 10//定义邻接矩阵的最大大小为10x10
typedef int Vertex;//用来表示边
int Graph[MaxSize][MaxSize];//以邻接矩阵的方式存储图
bool Visited[MaxSize];//表示节点是否已经被访问
int queue[MaxSize] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };//BFS用到的队列。因为本题只用存储边的信息,所以队列不需要太复杂
void MakeGraph(int NV,int NE){
Vertex v1, v2;
for (int i = 0; i < NE; i++){
cin >> v1 >> v2;
Graph[v1][v2] = 1;//因为是无向图,所以要赋值两次
Graph[v2][v1] = 1;
}
}
void DFS(Vertex V,int NV){//传入边和边的数目
Visited[V] = true;//表示节点已经访问过了
cout <<" "<< V;//输出V
for (int i = 0; i < NV; i++){//遍历V的每个邻接点
if (Graph[V][i] == 1){
if (!Visited[i]){//如果该邻接点未被访问,则继续访问它
DFS(i, NV);
}
}}
}
void Enqueue(Vertex V, int *queue){//入队
int i;
for ( i= 0; i < MaxSize; i++){//遍历找到一个不为-1的节点
if (queue[i] == -1)
break;
}
queue[i] = V;
}
bool IsEmpty(int *queue){
return queue[0] == -1;//queue[0]!=-1表示队列不为空
}
Vertex Dequeue(int *queue){//出队
Vertex temp = queue[0];
for (int i = 0; i < MaxSize - 1; i++){
queue[i] = queue[i + 1];
}
queue[MaxSize - 1] = -1;
return temp;
}
void BFS(Vertex V, int NV){//传入边和边的数目
Vertex v;
Visited[V] = true;
cout << " " << V;
Enqueue(V, queue);
while (!IsEmpty(queue)){//队列不为空
v = Dequeue(queue);//出队
for (int i = 0; i < MaxSize; i++){
if (Graph[v][i] == 1){//对v的每个邻接点
if (!Visited[i]){//如果该节点未被访问过,就对该节点进行访问
Visited[i] = true;
cout << " " << i;
Enqueue(i, queue);//入队
} } }}
}
void ListCompent(int Graph[10][10],int NV,int Choose){
int i, j;
for (i = 0; i < NV; i++){
for (j = 0; j < NV; j++){
if (!Visited[i]){//如果i未被访问过
if (Graph[i][j] == 1){
switch (Choose)//根据Choose选择调用DFS还是BFS
{
case 1:cout << "{"; DFS(i, NV); cout << " }" << endl; break;
case 2:cout << "{"; BFS(i, NV); cout << " }" << endl; break;
}
}
}
}
if (!Visited[i]){ cout << "{ " << i << " }" << endl; }//!Visit[i],表示该节点是孤立点
}
}
int main(){
int nv, ne;
cin >> nv >> ne;
MakeGraph(nv, ne);
ListCompent(Graph, nv, 1);
for (int i = 0; i < MaxSize; i++){//重置访问状态,为了继续进行BFS访问
Visited[i] = 0;
}
ListCompent(Graph, nv, 2);
}