## 关于使用矩阵来建图,并BFS、DFS进行遍历
后续~前面使用vector容器来建图,就相当于是邻接表法来存储;
这里算是邻接矩阵~(个人觉得vector用起来舒服)多的不谈,直接上代码!
#include<iostream>
#include<queue>
#define INFINITY 65535
using namespace std ;
const int Max_Size = 100 ;
int G[Max_Size][Max_Size] ;
int n , e;//节点数,边数
int Visited[Max_Size];
void Create(){//建立图
cin >> n >> e ;
for(int i = 0 ;i<n ;i++ ){//初始化
for(int j = 0 ;j<n ;j++){
if(i == j ){
G[i][j] = 0 ;//
}else {
G[i][j] = INFINITY;
}
}
}
for(int i = 0 ;i<e ;i++ ){//插入边
int v1,v2 ;
cin >> v1 >> v2 ;
G[v1][v2] = 1 ;
G[v2][v1] = 1 ;
}
}
void BFS(int v){
queue<int >q ;
q.push(v);
Visited[v] = 1 ;
while (!q.empty()){
int u = q.front();
q.pop();
cout << u << " " ;
for(int i = 0 ;i<n;i++ ){
if(Visited[i] == 0 && G[u][i]!=INFINITY){//该点没去过,且可达
Visited[i] = 1 ;
q.push(i);
}
}
}
cout << endl ;
}
void BFSTravel(){
memset(Visited, 0, sizeof(Visited));
for (int i = 0; i<n; i++) {
if(Visited[i] == 0 ){
BFS(i);
}
}
}
void DFS(int v ){
if(Visited[v] == 0){//在这里已经控制了未被访问
Visited[v] = 1 ;
cout << v<< " ";
for(int i = 0 ;i<n;i++){
if(G[v][i] != INFINITY ){//所以在这里只要判断可达即可
DFS(i);
}
}
}
}
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 ;
}
有问题欢迎大家提出!