深度优先搜索遍历算法

连通图的DFS算法实现讨论

连通图的算法实现描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// An highlighted block
void DFS(Graph G,int v)
{ //从编号v的顶点开始对图G进行深度优先搜索遍历
int w;
visit(G,v); //访问顶点v
visited[v] = TRUE; //设置v已经访问标志
w = firstAdj(G,v); //求v的第一个邻接点,返回其编号给w
while(w!=0)
{
if(!visited[w])
DFS(G,w); //对v的邻接点w递归DFS
w = nextAdj(G,v,w); //找v的w后的下一个邻接点
}
}

(1) 基于邻接矩阵的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
// An highlighted block
void DFS(Graph G,int v)
{
visit(G,v); //访问顶点v,如:cout<<Data[v]<<"\t"
visited[v] = TRUE; //标记v已经访问
for(int w=1; w<=G.VerNum; w++) //循环找v的邻接点
{ //w为v的邻接点,且未被访问
if((G.AdjMatrix[v][w]>=1) && (G.AdjMatrix[v][w]<INF) && (!visited[w])) //考虑到图和网的通用性
{
DFS(G,w);
}
}
}

(2) 基于邻接表的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// An highlighted block
void DFS(Graph G,int v)
{
visit(v); //访问顶点v,如:cout<<Data[v]<<"\t"
visited[v] = TRUE; //标记编号为v的顶点已经访问
EdgeNode *p;
p=G.VerList[v].firstEdge; //p初始化为顶点v的边链表的头指针
while(p)
{
if(!visited[p->adjVer]) //p->adjVer为v的邻接点编号
DFS(G,p->adjVer); //递归深度遍历顶点v的邻接点
p = p->next; //p指向v的下一个邻接点
}
}

一般图的(通用)DFS算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// An highlighted block
void DFSTraverse(Graph G,int v)
{
int i; //顶点编号
for(i = 1 ; i <= G.VerNum; i++) //初始化访问标记数组
{
visited[i] = false;
}
DFS(G,v);
for(i = 1 ; i <= G.VerNum ; i++)
{ //循环遍历图中所有其他的连通分量
if(!visited[i])
{
DFS(G,i); //遍历i所在的连通分量
}
}
}

last update time 2023-08-24