说明:
BFS的图来自《算法导论》22-2;
DFS的图来自《算法导论》22-4;
C++11代码如下:
一、BFS
#include <iostream>
#include <vector>
#include <queue>
#include <forward_list>
using namespace std;
struct V //顶点
{
int parent = -1;
int distance = -1;
}v[6];
queue<int> que;
vector<forward_list<int>> G = {{1,3},{4},{5,4},{1},{3},{5}}; //邻接链表
void print(int node) //打印到结点node的路径
{
if (node == 0)
cout << "0 ";
else if(v[node].parent == -1)
{
cout<<"No way";
return;
}
else
{
print(v[node].parent);
cout<<node<<" ";
}
}
int main()
{
v[0].distance = 0;
que.push(0); //把0结点加入到队列里
while (!que.empty())
{
for(auto p : G[que.front()]) //在相邻结点里查找白色节点,处理其信息并加入队列
{
if (v[p].distance == -1)
{
que.push(p);
v[p].distance = v[que.front()].distance + 1;
v[p].parent = que.front();
}
}
que.pop();
}
for(int i=0;i<6;++i)
{
print(i);
cout<<endl;
}
return 0;
}
二、DFS
#include <iostream>
#include <forward_list>
#include <vector>
using namespace std;
struct Node
{
int discover = 0,finish = 0;
int parent = -1;
} node[6];
vector<forward_list<int>> G = {{1,3},{4},{4,5},{1},{3},{5}}; //邻接链表
int time = 0;
void DFS(int i)
{
for(auto p : G[i]) //搜索结点i的所有相邻结点
{
if(node[p].parent == -1) //找到一个白色结点,处理好其信息后就递归下去
{
++time;
node[p].discover = time;
node[p].parent = i;
DFS(p);
}
}
++time;
node[i].finish = time; //邻接链表扫描完的时间
}
void print(int i) //打印信息
{
cout<<"node: "<<i<<endl;
cout<<"parent: "<<node[i].parent<<endl;
cout<<"discover/finish: "<<node[i].discover<<'/'<<node[i].finish<<endl<<endl;
}
int main()
{
for(int i=0; i<6; ++i)
{
if(node[i].parent == -1) //可能有多个源节点
{
++time;
node[i].discover = time;
DFS(i);
}
}
for(int i=0;i<6;++i) //打印所有信息
print(i);
return 0;
}