关于使用Vector容器建图以及BFS、DFS遍历:
Vector建图是真的简单…多的不谈,直接上代码!
//
// main.cpp
// Created on 2020/10/24.
//
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int Max_Len = 100 ;//最多100个节点
int Visited[Max_Len] ;//标记数组,节点是否被访问
vector<int > v [Max_Len];
int n , e;//实际节点数,边数
void Create(){
cin >> n ;
for(int i = 0 ;i<n ;i++){//初始化
v[i].clear();
}
cin >> e ;
while (e > 0){
int v1 ,v2 ;
cin >>v1 >> v2 ;//输入边
v[v1].push_back(v2);//在v1 节点后面插入,代表已经链接
v[v2].push_back(v1);//无向图,需要插入两遍(有向图不用)
e-- ;
}
}
void BFS(int x){//BFS借助队列
queue<int >q ;
q.push(x);
Visited[x] = 1 ;//标志已经访问过
while (!q.empty()){
int u = q.front() ;
q.pop();
cout << u << " ";
for(int i = 0 ;i<v[u].size() ;i++ ){//小小需要注意,这里i小于的是当前节点为根节点 的那一行 的长度;
int p = v[u][i];
if(Visited[p] == 0){
q.push(p);
Visited[p] = 1 ;
}
}
}
cout << endl ;
}
int num = 0;
void BFSTravel(){//这里是为了防止 所给的图不是连通图 ;同时可以利用BFS来求最大连通子图的个数
memset(Visited, 0, sizeof(Visited));
for(int i = 0 ;i< n ;i++ ){
if(Visited[i] == 0 ){
num ++ ;
BFS(i);
}
}
cout << "最大连通子图个数:"<< num << endl ;
}
void DFS(int x ){//DFS用递归——不管是图还是树,跟深度联系的,很多都可以用递归,简单!
Visited[x] = 1 ;
cout << x << " ";
for(int i = 0 ;i < v[x].size(); i ++ ){
int p = v[x][i];
if(Visited[p] == 0 ){
DFS(p);
}
}
}
void DFSTravel(){//原理相同,同样可以求最大连通子图
memset(Visited, 0, sizeof(Visited));
for(int i = 0 ;i< n ;i++ ){
if(Visited[i] == 0 ){
DFS(i);
}
}
}
int main() {
Create();
cout << "BFS: ";BFSTravel();
cout << "DFS: ";DFSTravel();
cout << endl ;
return 0;
}
有啥问题欢迎大家私信,大家一起学习!!