目录
一、DFS
深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.(百度百科)
通常,可以用栈stack结构来存储。
1. DFS搜索的伪代码如下:
DFS(G)
{
for each vertex u
{
u.color = WHITE;
}
time = 0;//时间戳
for each vertex u
{
if (u.color == WHITE)
DFS_Visit(u);
}
}
DFS_Visit(u)
{
u.color = gray;
time = time+1;
u. d = time;//将时间戳加1并保存在d中
for each v in u.Adj[]
{
//遍历当前顶点的所有邻居顶点
if (v.color = = WHITE)
DFS_Visit(v);
}
u.color = black;
time = time+1;
u.f = time;
//时间戳d和f记录了每个顶点第一次被访问和最后一次被访问的时间。
}
2. DFS的应用:判断有向图中是否存在环
DFS(G){
for each vertex u{
u.color = WHITE;
u.parent = NULL;
}
for each vertex u{
if (u.color == WHITE)
if (DFS_Visit(u) == true)
return true;//存在环
}
return false;//不存在环
}
DFS_Visit(u){
u.color = GRAY;
for each v in u.Adj[]{
if (v.color == WHITE){
v.parent = u;
if (DFS_Visit(v) == true) return true;
}
else if (v.color == GRAY) return true;
}
u.color = BLACK;
return false;
}
3. DFS的应用:判断无向图中是否存在环
DFS(G)
{
for each vertex u
{
u.color = WHITE;
u.parent = NULL;//无向图中要加入对父子节点的判别
}
for each vertex u
{
if (u.color == WHITE)
if (DFS_Visit(u) == true)
return true;//存在环
}
return false;//不存在环
}
DFS_Visit(u)
{
u.color = GRAY;
for each v in u.Adj[]
{
if (v.color == WHITE)
{
v.parent = u;
if (DFS_Visit(v) == true) return true;
}
else if (v.color == GRAY && v != u.parent)
return true;
}
u.color = BLACK;
return false;
}
二、 BFS
广度优先搜索(BFS)算法,是一种基于队列的搜索算法,用于遍历或搜索图形或树的数据结构。它从指定的源节点开始,遍历其相邻节点,然后逐层遍历其它未访问的相邻节点,直到所有节点都被访问。
通常,可以用队列queue结构来存储。
1. BFS搜索的伪代码如下:
BFS(G,s){//图G,源节点s
initialize vertices;//初始化:u.color=WHITE,time=0;
Q={s};
while(Q not empty){
u=RemoveTop(Q);//队头元素
for each v in u.adj[]{
if(v.color==WHITE)
v.color=GRAY;
v.d=u.d+1;
v.p=u;
Enqueue(Q,v);//入队
}
u.color=BLACK;
}
}
2. BFS的应用:最短路径算法(加权图)
BFS(G, s){
for each vertex v {
if v != s {
path = [v];
while (v.p != s) {
path.append(v.p);
v = v.p;
}
path.append(s);
path.reverse();
print(path);
}
}
}
3. BFS的应用:最短路径算法(非加权图)
ShortestPath(G, s) {
initialize vertices;
Q = {s};
while (Q not empty) {
u = RemoveTop(Q);
for each v u.adj[] {
if (v.color == WHITE) {
v.color = GREY;
v.d = u.d + 1;
v.p = u;
Enqueue(Q, v);
}
}
u.color = BLACK;
}
for each vertex v {
if v != s {
path = [v];
while (v.p != s) {
path.append(v.p);
v = v.p;
}
path.append(s);
path.reverse();
print(path);
}
}
}
4. BFS应用:图的直径
图的直径是指图中所有节点对之间最短路径的最大值。直径是图的一个重要性质,它可以用于评估图的大小和复杂度。
GraphDiameter(G) {
initialize vertices;
maxDiameter = 0;
for each vertex s {
BFS(G, s);
for each vertex v {
if v.d > maxDiameter {
maxDiameter = v.d;
}
}
}
return maxDiameter;
}