最近,做了几道关于图的题目,略感生疏。准备看看算法导论复习一下。说到基本的图算法,那就必然会提高图算法的核心-搜索,经典的 广度搜索BFS 和 深度搜索DFS
形象点说,前者就是 水面上泛起的 涟漪,一层一层注重广度;而后者 就是 打洞,往深里去,打完一个洞,再打另一个洞。
算法导论,第22章基本图算法,广度遍历,我看了下书里面的例子,觉得挺好,下面自己实现了一下,写的简单了些,大神勿喷。
#include <iostream>
#include <queue>
using namespace std;
#define N 10
#define MAX 100
int map[N][N];
bool visit[N];
int dis[N];
queue<int>q;
void BFS(int s){ //从源点开始广度遍历,输出依次访问的点
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
while(!q.empty())
q.pop();
q.push(s);
dis[s] = 0;
cout<<"节点访问顺序,节点深度:"<<endl;
cout<<s<<" "<<dis[s]<<endl;
visit[s] = 1;
while(!q.empty()){
int u = q.front();
q.pop();//假设图中有8个点
for(int i=1;i<=8;i++){
if(map[u][i] == 1&&!visit[i]){
cout<<i<<" ";
dis[i] = dis[u] + 1;
cout<<dis[i]<<endl;
visit[i] = 1;
q.push(i);
}
}
}
}
int main(){
int i;
memset(map,MAX,sizeof(MAX));
for(i=1;i<=8;i++){ //假设图中有8个点
map[1][2] = map[2][1] = 1;
map[1][3] = map[3][1] = 1;
map[3][4] = map[4][3] = 1;
map[4][5] = map[5][4] = 1;
map[4][6] = map[6][4] = 1;
map[5][6] = map[6][5] = 1;
map[5][7] = map[7][5] = 1;
map[6][7] = map[7][6] = 1;
map[7][8] = map[8][7] = 1;
map[6][8] = map[8][6] = 1;
}
int s = 3;
BFS(s);
return 0;
}