zoukankan      html  css  js  c++  java
  • 数据结构8——图的遍历

    图形中数据的遍历分为两种情况,一种是深度优先遍历,一种是广度优先遍历。

    1:深度优先遍历

    深度优先遍历类似于树中的先序遍历,进入到一个分支之后一直往下进行,直到该分支遍历完成。

    书中写到:在图的所有邻接点中,每次都在访问完当前结点后首先访问当前节点的第一个邻接结点。

    可以写出类似的伪码:

     1 void DFS(Vertex v){                   //1:访问结点v
     2      visited[v]=true;                  //2:并且标记结点已经被访问过
     3        for(v每一个邻接点w){              /3:/检查v的每一个邻接点
     4          if(!visited[w]){              //4:如果结点w没有被访问过则继续访问该节点,直到所有的结点都被访问
     5             DFS(W)
     6     }
     7   }
    10 }

     深度优先遍历的算法实现:

     1 //连通图的深度优先遍历
     2     public void DFS(int v,boolean[] visited, Visit vs)throws Exception{
     3         //其中visited中0表示未访问,1表示已经访问
     4         vs.print(getValue(v));
     5         visited[v]=true;
     6         
     7         int w=getFirstNeighbor(v);            //获得v的第一个邻接点
     8         while(w!=-1){                        //判断v是否有邻接点,并且判断邻接点是否被访问过
     9             if (!visited[w]) {
    10                 DFS(w, visited, vs);
    11             }
    12             w=getNextNeighbor(v, w);        //取出下一个邻接点
    13             
    14         }
    15     

    2:广度优先遍历

    图形的广度优先遍历,类似于层序遍历,通过分层的方式遍历各个结点。

    广度优先遍历需要一个队列保持访问过的结点的顺序,以便按访问过的结点的顺序来访问这些结点的相邻结点。

     1 //广度优先遍历的伪码
     2 
     3 void BFS(vertex v){
     4      visited[v]=true;                       //1:首先访问结点v并且标记结点v为访问状态
     5      InQueue(v,Q);                        //2:结点v进入到队列中去
     6      while(!IsEmpty(Q)){                    //3:当队列不为空的时候继续执行,否则算法结束
     7         v=deleteQueu(Q)                     //4:出队列获取原来队列中头位置的结点
     8         for(v的每一个邻接点w){                  //5:查找v结点的每一个相邻结点w
     9           if(!visited[w]){                   //
    10              visited[w]=true; 
    11              InQueue(w,Q);
    12            }
    13          }
    14 
    15   }     
    19 }

     广度优先搜索的算法实现:;

     1 //连通图的广度优先遍历    类似于层序遍历用队列来遍历
     2     public void BFS(int v,boolean[] visited, Visit vs)throws Exception{
     3         int u,w;
     4         
     5         SeqQueue queue=new SeqQueue();
     6         vs.print(getValue(v));
     7         visited[v]=true;
     8         
     9         //将结点v压入到队列queue中去
    10         queue.append(new Integer(v));
    11         while(queue.notEmpty()){
    12             u=(Integer)queue.delete();            //出队列
    13             w=getFirstNeighbor(u);                //并且取出u的第一个邻接点w
    14             //判断w是否存在,并且w没有被访问过
    15             while(w!=-1){
    16                 if (!visited[w]) {
    17                     vs.print(getValue(w));
    18                     visited[w]=true;
    19                     queue.append(w);             //将结点w入队列中
    20                 }
    21                 //获得结点u的邻接点w的一下一个邻接结点
    22                 w=getNextNeighbor(u, w);
    23             }
    24         }
    25     }
  • 相关阅读:
    visio 改变画布大小
    Delphi 让自己的软件实现双击打开文件 转
    气相色谱里面的斜率灵敏度什么意思
    色谱峰的类型BB,BV,VB等都是什么意思
    Delphi的windows剪切板操作函数
    上传图片,多图上传,预览功能,js原生无依赖
    前端性能监控:window.performance
    ES6新属性笔记
    :jQuery实例【DEMO】
    自定义checkbox/radio
  • 原文地址:https://www.cnblogs.com/xiaxj/p/6673699.html
Copyright © 2011-2022 走看看