图论算法-搜索

来源:互联网 发布:单片机计分牌课设 编辑:程序博客网 时间:2024/06/06 06:30

BFS

bool visited[MAX_VERTEX_NUM);           //访问标记数组  void BFSTraverse(Graph G){              //对图G进行广度优先遍历,设访问函数为visit()      for(i=0;i<G.vexnum;i++)          visited[i]=FALSE;               //访问标志数组初始化      InitQueue(Q);                       //初始化辅助队列Q      for(i=0;i<G.vexnum;i++)              //从0号顶点开始遍历          if(!visited[i])                 //对每个连通分量开始遍历              BFS(G,i);                   //v[i]未访问过,从v[i]开始BFS  }  void BFS(Graph G,int v){                //从顶点v出发,广度优先遍历图G,算法借助一个辅助队列Q      visit(v);                           //访问初始顶点v      visited[v]=TRUE;                    //对v做已访问标志      Enqueue(Q,v);                       //顶点v入队列      while(!isEmpty(Q)){          DeQueue(Q,v);                   //顶点v出队列          for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)) //检测v所有邻接点              if(!visited[w]){            //w为v的尚未访问的邻接顶点                  visit(w);               //访问顶点w                  visited[w]=TRUE;        //对w做已访问标记                  EnQueue(Q,w);           //顶点w入队列              }      }  }  

DFS

bool visited[MAX_VERTEX_NUM];  int Vnum=0,Enum=0;  bool IsTree2(Graph G){      for(i=1;i<=G.vexnum;i++)          visited[i]=FALSE;      DFS(G,1);      if(Vnum==G.vexnum && Enum==2*(G.vexnum-1))          return TRUE;      else          return FALSE;  }  void DFS(Graph G,int v){      visited[v]=TRUE;      Vnum++;      int w=FirstNeighbor(G,v);      while(w!=-1){                       //可以写成for的形式          Enum++;          if(!visited[w])              DFS(G,w);          w=NextNeighbor(G,v,w);      }  }  


0 0
原创粉丝点击