数据结构之图的遍历(BFS+DFS)

//定义全局变量

const int Maxnum=50;
typedef int AdjMatrix[Maxnum][Maxnum];//定义边数组结构
typedef Struct
{
   int vexnum,arcnum;//顶点数、边数
   AdjMatrix arcs;//边数组
}Graph;//图

bool visited[Maxnum];//标记是否访问的数组

//DFS:时间复杂度O(n*n)

//相当于树遍历中的前序遍历

//适合寻找目标明确,以找到目标为目的的情况

void DFS(Graph &g, int v)
{
   visited[v]=true;//从V开始访问,flag它
   printf("%d",v);//打印v
   for(int j=0;j<g.vex.num;j++)
   {
      if(arcs[v][j]==1 && visited[j]==false)//这里可以获得V未访问过的邻接点
	     DFS(g,j);//递归调用,如果所有节点都被访问过,就回溯,而不再调用这里的DFS
   }
}
void DFSTraverse(Graph &g)
{
   for(int i=0;i<g.vexnum;i++)//初始化访问数组
       visited[i]=false;
	   
   for(int i=0;i<g.vexnum;i++)
   {
       if(visited[i]==false)//从没有访问过的第一个元素来遍历图
	      DFS(g,i);
   }
}

//BFS:时间复杂度O(n*n)

//相当于树遍历中的层次遍历

//适合在不断扩大遍历范围时找到相对最优解的情况

void(Graph &g)
{
  for(int i=0;i<g.vexnum;i++)//初始化访问数组
       visited[i]=false;
  queue<int> Q;
  for(int i=0;i<g.vexnum;i++)
  {
     if(visited[i]==false)//若该点没有访问
       {
		 visited[i]=true;//标记该点
		 Q.push(i);//将该点加入队列
	     while(!Q.empty())//只要队列不空,遍历就没有结束
	     {
	        int t=Q.front();//取出队头元素
		    printf("%d",t);//打印t
		    Q.pop();
		    for(int j=0;j<g.vexnum;j++)
		    {
		       if(arcs[t][j]==1 && visited[j]==false)//将其未访问过的邻接点加进入队列
			   {
			      visited[j]==true;//在这里要设置true,因为这里该顶点我们已经加入到了队列,为了防止重复加入!
				  Q.push(j);
			   }
		    }
	      }
       }
  }		 
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/hk627989388/article/details/76862090
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞