当前位置: 首页 > news >正文

广州花都网站建设angular 做网站

广州花都网站建设,angular 做网站,西安seo管理,如何设计营销 网站建设目录 广度优先遍历与最短路径 Java 实例代码 src/runoob/graph/ShortestPath.java 文件代码: 广度优先遍历与最短路径 广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问…

目录

 

广度优先遍历与最短路径

Java 实例代码

src/runoob/graph/ShortestPath.java 文件代码:


 

广度优先遍历与最短路径

广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问的邻接点 {vi,..,vj} ,并将其标记为已访问过,然后将 {vi,...,vj} 中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。

我们可以分为三个步骤:

  • (1)使用一个辅助队列 q,首先将顶点 v 入队,将其标记为已访问,然后循环检测队列是否为空。
  • (2)如果队列不为空,则取出队列第一个元素,并将与该元素相关联的所有未被访问的节点入队,将这些节点标记为已访问。
  • (3)如果队列为空,则说明已经按照广度优先遍历了所有的节点。

下图所示,右边蓝色表示从 0 开始遍历节点的顺序,下面是记录距离 0 的距离,可知广度优先遍历能求出无权图的最短路径。

 

b3c43b0d2586676d77450effdd17123a.png

下面用代码展示如何用广度优先遍历方式完成遍历,并且查询到最短路径。我们在上一小节代码的基础上增加一全局变量 ord 数组,记录路径中节点的次序。ord[i] 表示 i 节点在路径中的次序。同时构造函数做出相应调整,在遍历相邻节点时 每访问一个未被访问的节点进行 ord[i] = ord[v] + 1记录距离。邻接表的广度优先遍历时间复杂度为 O(V+E),邻接矩阵的时间复杂度为O(V^2)。

...
// 构造函数, 寻路算法, 寻找图graph从s点到其他点的路径
public ShortestPath(Graph graph, int s){
    // 算法初始化
    G = graph;
    assert s >= 0 && s < G.V();

    visited = new boolean[G.V()];
    from = new int[G.V()];
    ord = new int[G.V()];
    for( int i = 0 ; i < G.V() ; i ++ ){
        visited[i] = false;
        from[i] = -1;
        ord[i] = -1;
    }
    this.s = s;
    // 无向图最短路径算法, 从s开始广度优先遍历整张图
    LinkedList<Integer> q = new LinkedList<Integer>();
    q.push( s );
    visited[s] = true;
    ord[s] = 0;
    while( !q.isEmpty() ){
        int v = q.pop();
        for( int i : G.adj(v) )
            if( !visited[i] ){
                q.push(i);
                visited[i] = true;
                from[i] = v;
                ord[i] = ord[v] + 1;
            }
    }
}
...

查看从 s 点到 w 点的最短路径长度,若从 s 到 w 不可达,返回-1。

...
public int length(int w){
    assert w >= 0 && w < G.V();
    return ord[w];
}
...

Java 实例代码

源码包下载:Download

src/runoob/graph/ShortestPath.java 文件代码:

package runoob.graph;

import runoob.graph.read.Graph;

import java.util.LinkedList;
import java.util.Stack;
import java.util.Vector;

/**
 * 广度优先遍历与最短路径
 */
public class ShortestPath {
    // 图的引用
    private Graph G;
    // 起始点
    private int s;
    // 记录dfs的过程中节点是否被访问
    private boolean[] visited;
    // 记录路径, from[i]表示查找的路径上i的上一个节点
    private int[] from;
    // 记录路径中节点的次序。ord[i]表示i节点在路径中的次序。
    private int[] ord;
    // 构造函数, 寻路算法, 寻找图graph从s点到其他点的路径
    public ShortestPath(Graph graph, int s){

        // 算法初始化
        G = graph;
        assert s >= 0 && s < G.V();

        visited = new boolean[G.V()];
        from = new int[G.V()];
        ord = new int[G.V()];
        for( int i = 0 ; i < G.V() ; i ++ ){
            visited[i] = false;
            from[i] = -1;
            ord[i] = -1;
        }
        this.s = s;
        // 无向图最短路径算法, 从s开始广度优先遍历整张图
        LinkedList<Integer> q = new LinkedList<Integer>();
        q.push( s );
        visited[s] = true;
        ord[s] = 0;
        while( !q.isEmpty() ){
            int v = q.pop();
            for( int i : G.adj(v) )
                if( !visited[i] ){
                    q.push(i);
                    visited[i] = true;
                    from[i] = v;
                    ord[i] = ord[v] + 1;
                }
        }
    }

    // 查询从s点到w点是否有路径
    public boolean hasPath(int w){
        assert w >= 0 && w < G.V();
        return visited[w];
    }
    // 查询从s点到w点的路径, 存放在vec中
    public Vector<Integer> path(int w){
        assert hasPath(w) ;
        Stack<Integer> s = new Stack<Integer>();
        // 通过from数组逆向查找到从s到w的路径, 存放到栈中
        int p = w;
        while( p != -1 ){
            s.push(p);
            p = from[p];
        }

        // 从栈中依次取出元素, 获得顺序的从s到w的路径
        Vector<Integer> res = new Vector<Integer>();
        while( !s.empty() )
            res.add( s.pop() );

        return res;
    }

    // 打印出从s点到w点的路径
    public void showPath(int w){
        assert hasPath(w) ;
        Vector<Integer> vec = path(w);
        for( int i = 0 ; i < vec.size() ; i ++ ){
            System.out.print(vec.elementAt(i));
            if( i == vec.size() - 1 )
                System.out.println();
            else
                System.out.print(" -> ");
        }
    }
    // 查看从s点到w点的最短路径长度
    // 若从s到w不可达,返回-1
    public int length(int w){
        assert w >= 0 && w < G.V();
        return ord[w];
    }
}

 

 

http://www.yayakq.cn/news/240037/

相关文章:

  • 六安网站建设推荐怎么手动安装网站程序
  • 网站备案 中国网站数据库如何备份
  • 博物馆网站做的最好的网站建设拍金手指谷哥12
  • asp.net不适合做网站湖南专业网站建设
  • 嘉祥网站seo国外空间网站
  • 禁止wordpress更新config百度seo排名推广
  • 龙岩网站建设方案优化合肥小程序设计
  • 厦门好的做网站公司株洲湘潭交通新闻
  • 莆田外贸自建网站自己做网站的过程
  • 网站建站 公司网站开发流程怎么写
  • 本溪市城乡住房建设厅网站千锋教育的官网
  • joomla 企业网站模板企业网站托管价格
  • 阿里云建设网站教程图文广告加盟哪家好
  • asp婚纱摄影网站源码烟台汽车网站建设
  • 南昌网站建设有哪几家广州新闻最新消息10条
  • 兰州网站推广建设公司济南php网站开发
  • 上海浦东建筑建设网站电商运营推广是做什么的
  • wordpress登录后才允许浏览seo实战指导
  • 哪里有做家教网站的企业手机网站设计案例
  • 三亚 网站建设江苏省建设通官方网站
  • 深圳华强北做网站广告东莞网站建设技术支持
  • 动易网站模板制作方法功能类网站
  • 网站人员队伍建设落后南昌中小企业网站制作
  • 定西市网站建设咨询win7系统优化工具
  • 免费的ppt模板网站有哪些电子商务网站建设与维护03
  • 园区门户网站建设方案wordpress 简书模板
  • wordpress 首页模板在哪里可以免费自学seo课程
  • 世界杯网站源码下载百度云加速 网站关键词
  • 电脑网站微信支付怎么做的网站建设最基础是什么
  • 做小说网站做国外域名还是国内的好处网站开发和网站维护有区别吗