zoukankan      html  css  js  c++  java
  • 图的表示与遍历

    图的表示:连接矩阵,连接链表。

    图的遍历:dfs(递归、非递归),bfs.

    连接矩阵下各种遍历:

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Queue;
    import java.util.Stack;
    
    public class Graph {
        int v;
        int e;
        int[][] mat;
    
        public Graph(int v) {
            this.v = v;
            this.e = 0;
            mat = new int[v][v];
        }
    
        public void addEdge(int a, int b) {
            if (mat[a][b] == 0)
                e++;
            mat[a][b] = 1;
            mat[b][a] = 1;
        }
    
        public Iterable<Integer> adj(int a) {
            List<Integer> res = new ArrayList<Integer>();
            for (int i = 0; i < v; i++) {
                if (mat[a][i] != 0) {
                    res.add(i);
                }
            }
            return res;
        }
    
        public void dfsNonRecur() {
            boolean[] vis = new boolean[v];
            for (int i = 0; i < v; i++) {
                if (!vis[i]) {
                    dfsNonRecur(i, vis);
                }
            }
            System.out.println();
    
        }
    
        public void dfs() {
            boolean[] vis = new boolean[v];
            for (int i = 0; i < v; i++) {
                if (!vis[i]) {
                    dfs(i, vis);
                }
            }
            System.out.println();
    
        }
    
        private void dfs(int i, boolean[] vis) {
            vis[i] = true;
            System.out.print(i + " ");
            for (Integer each : adj(i)) {
                if (!vis[each])
                    dfs(each, vis);
            }
        }
    
        private void dfsNonRecur(int i, boolean[] vis) {
            Stack<Integer> stack = new Stack<Integer>();
            vis[i] = true;
            stack.push(i);
            System.out.print(i + " ");
    
            while (!stack.isEmpty()) {
                Integer top = stack.peek();
                boolean finished = true;
                for (Integer each : adj(top)) {
                    if (!vis[each]) {
                        System.out.print(each + " ");
                        vis[each] = true;
                        stack.push(each);
                        finished = false;
                        break;
                    }
                }
                if (finished) {
                    if (!stack.isEmpty())
                        stack.pop();
                }
    
            }
    
        }
    
        public void bfs() {
            boolean[] vis = new boolean[v];
            for (int i = 0; i < v; i++) {
                if (!vis[i]) {
                    bfs(i, vis);
                }
            }
            System.out.println();
    
        }
    
        public void bfs(int start, boolean[] vis) {
            Queue<Integer> queue = new LinkedList<Integer>();
            queue.add(start);
            vis[start] = true;
            System.out.print(start + " ");
            while (!queue.isEmpty()) {
                Integer out = queue.remove();
                for (Integer each : adj(out)) {
                    if (!vis[each]) {
                        vis[each] = true;
                        queue.add(each);
                        System.out.print(each + " ");
                    }
                }
    
            }
    
        }
    
        public static void main(String[] args) {
            Graph g = new Graph(5);
            g.addEdge(0, 1);
            g.addEdge(0, 3);
            g.addEdge(1, 2);
            g.addEdge(3, 4);
    
            g.dfs();
            g.dfsNonRecur();
            g.bfs();
        }
    
    }

    参考资料:

    http://algs4.cs.princeton.edu/41undirected/AdjMatrixGraph.java.html

    http://algs4.cs.princeton.edu/41undirected/Graph.java.html

    http://blog.csdn.net/lalor/article/details/6845788

  • 相关阅读:
    hdoj 2041 超级楼梯
    hdoj 刚入门~把11页A了一些~~
    编写Powerdesigner脚本,快速生成数据库表
    网站
    duwamish
    面试题
    http://www.sqlclub.com
    Microsoft PetShop 3.0 设计与实现数据访问层
    Java代码查询站点
    从Blog上面去掉那该死的“狗狗订阅”的logo !
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3966761.html
Copyright © 2011-2022 走看看