欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构(五)之图的深度优先遍历和广度优先遍历

程序员文章站 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的下一个邻接点 
		}		
    }
 }