数据结构(五)之图的深度优先遍历和广度优先遍历
程序员文章站
2022-05-20 19:05:45
...
/*深度优先搜索策略*/
/*dfs深度搜索策略:①从某个顶点v0出发,首先访问v0。
② 找出刚访问节点的第一个未被访问的邻接点,然后访问该节点。以该节点为新顶点,重复此步骤,直到刚访问
过的顶点没有未被访问的邻接点位置。
③返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该邻接点,
然后执行步骤②
定义一个visit数组,来判断将要访问的结点是否已经被访问过 */
void TraverGraph(Graph g)
{
for(int i=0;i<g.vexnum;i++)
{
visit[i]=0;
}
for(int i=0;i<g.vexnum;i++)
{
DfsTravel(g,i);
}
}
DfsTravel(Graph g ,int v0)
{
visit(v0);
visit[v0]=1;
w=First(g,v0);
while(w!=-1)
{
if(!visit[w])
{
DfsTravel(g,w);
}
w=NextAdjVertex(g,v0,w);
}
}
/*采用邻接矩阵的深度优先算法*/
void dfstravel(AdjMatrix g,int v0)
{
visit(v0);
visit[v0]=1;
for(int vj=0;vj<g.vexnum;vj++)
{
if(!visit[vj]&&g.arcs[v0][vj]==1)
{
dfstravel(g,vj);
}
}
}
/*采用邻接表的深度优先搜索*/
void dfstravel(Adjlist g,int v0)
{
visit(v0);
visit[v0]=1;
p=g.vextex[v0].firstarc;
while(p!=NULL)
{
if(!visit[p->adjvex])
dfstravel(g,p->adjvex);
p=p->nextarc;
}
}
/*广度优先遍历策略
①从图中某个顶点从发,首先访问v0
②依次访问v0的各个未被访问的邻接点
③分别从这些邻接点出发,依次访问它们的各个未被 访问的邻接点*/
void BreadFirstSearch(Graph g,int v0)
{
visit(v0);
visit[v0]=1;
InitQueue(&Q);
EnterQueue(&Q,v0);
while(!Empty(Q))
{
DeleteQueue(&Q,&v);//出队列
w=FisrtAdjvertex(g,v);//求第一个邻接点
while(w!=-1)
{
if(!visit[w])//如果没有访问过,进队列
{
visit(w);
visit[w]=1;
EnterQueue(&g,w);
}
w=nextAdjVertex(g,v,w); //找v的下一个邻接点
}
}
}