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

/*深度优先搜索策略*/

/*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的下一个邻接点 
		}		
    }
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值