美文网首页
无向图的构建,DFS和BFS

无向图的构建,DFS和BFS

作者: xilovesyu | 来源:发表于2017-11-08 21:02 被阅读0次

无向图的构建

我的目标是输入顶点个数以及一系列的边来构建出无向图。
表示图的方法有邻接矩阵,邻接表,以及边的列表
设计Graph类,该类中包含V,E,以及邻接表adj。

public Graph(int V, int[][] edges) {
        // 输入参数.一个是顶点的个数,接下来是n条边
        this.V = V;
        this.adj = (ArrayList<Integer>[]) new ArrayList[this.V];
        for (int i = 0; i < this.V; i++) {
            this.adj[i] = new ArrayList<>();
        }
        for (int i = 0; i < edges.length; i++) {
            int from = edges[i][0];
            int to = edges[i][1];

            this.adj[from].add(to);
            this.adj[to].add(from);
            this.E++;
        }
    }

DFS

无向图的深度优先遍历总是递归寻找到该节点对应的链表所有可能的节点。代码如下:

  public void dfs(int v) {
        boolean[] marked = new boolean[this.V];
        int[] edgeTo=new int[this.V];
        dfs(marked,edgeTo, v);
        System.out.println(Arrays.toString(edgeTo));
    }
  private void dfs(boolean[] marked,int[] edgeTo, int v) {
        marked[v] = true;
        System.out.println("v:" + v);
        for (int i : this.adj[v]) {
            if (!marked[i]) {
                edgeTo[i]=v;
                dfs(marked,edgeTo, i);
            }
        }
    }

marked表示该节点是否被访问过,edgeTo表示从点v开始到任意一点的路径,如果要输出路径,可以通过如下途径输出(倒置):

  int temp=v2;
  System.out.print("path: ");
  while(temp!=v1){
    System.out.print(temp+",");
    temp=edgeTo[temp];
  }
  System.out.println(v1);

BFS

广度优先遍历通过队列的方式进行(和二叉树的层次遍历相同)

    public void bfs(int v){
        boolean[] marked=new boolean[this.V];
        int[] edgeTo=new int[this.V];
        bfs(marked, edgeTo, v);
    }
    public void bfs(boolean[] marked,int[] edgeTo,int v){
        Queue<Integer> queue=new LinkedList<>();
        queue.add(v);
        marked[v]=true;
        while(!queue.isEmpty()){
            int a=queue.poll();
            System.out.println("v:"+a);
            for(int w:this.adj[a]){
                if(!marked[w]){
                    marked[w]=true;
                    edgeTo[w]=a;
                    queue.add(w);
                }
            }
        }
        System.out.println(Arrays.toString(edgeTo));
    }

相关文章

  • 无向图 图的表示方法:邻接表 dfs和bfs的区别:dfs是用栈,bfs用队列 有向图 有向无环图(DAG): 不...

  • 邻接表|DFS|BFS

    结构定义 创建无向图 输出 DFS BFS

  • 无向图的构建,DFS和BFS

    无向图的构建 我的目标是输入顶点个数以及一系列的边来构建出无向图。表示图的方法有邻接矩阵,邻接表,以及边的列表设计...

  • 无向图DFS和BFS

    基本结构 DFS深度优先遍历 BFS广度优先遍历 符号图

  • 用Python实现树的BFS与DFS

    一、BFS与DFS简介 在理解动态规划、BFS和DFS一文中,已经集合具体例子,介绍了图的BFS与DFS。但是比较...

  • BFS和DFS随笔

    BFS和DFS BFS和DFS视频讲解-正月点灯笼 BFS核心点是用队列存放当前搜索的点 用在有环图的时候需要存放...

  • 图的桥和割点

    内容概要: 图中的桥 图的DFS遍历树和BFS遍历树及其与寻桥算法的关系 图的割点 DFS和BFS的对比小结 桥(...

  • 06 - 图 1 列出连通集 (25 分)

    给定一个有 N 个顶点和 E 条边的无向图,请用 DFS 和 BFS 分别列出其所有的连通集。假设顶点从 0 到 ...

  • BFS及其应用

    内容概要: BFS类的实现 BFS求解连通分量 BFS求解无向图点对之间的一条最短路径 BFS判定无环图和二分图 ...

  • 图论小结

    图的存储 邻接矩阵 邻接表 图的遍历 DFS(双向DFS) BFS(剪枝) 单源最短路径算法 dij 条件:无负权...

网友评论

      本文标题:无向图的构建,DFS和BFS

      本文链接:https://www.haomeiwen.com/subject/qicymxtx.html