无向图DFS和BFS

作者: 谜碌小孩 | 来源:发表于2016-11-23 18:33 被阅读0次

基本结构

public class Graph {
    private int V;  //顶点数
    private int E;  //边数
    private ArrayList<Integer>[] adj;

    public Graph(int v) {
        V = v;
        E = 0;
        adj = new ArrayList[v];
        for (int i = 0; i < V; i++) {
            adj[i] = new ArrayList<>();
        }
    }

    public void addEdge(int v, int w) {
        if (v < 0 || v > V) {
            throw new IndexOutOfBoundsException();
        }
        adj[v].add(w);
        adj[w].add(v);
        E++;
    }

    public int getE() {
        return E;
    }

    public int getV() {
        return V;
    }

    public Iterable<Integer> adj(int v) {
        return adj[v];
    }
}

DFS深度优先遍历

public class DepthFirstSearch {
    private boolean[] marked;
    private int[] edgeTo;
    private final int s;
    private int count;

    public DepthFirstSearch(Graph G, int s) {
        marked = new boolean[G.getV()];
        edgeTo = new int[G.getV()];
        this.s = s;
        dfs(G, s);
    }

    public boolean marked(int w) {
        return marked[w];
    }

    public boolean hasPathTo(int v) {
        return marked[v];
    }

    public Iterable<Integer> pathTo(int v) {
        if (!hasPathTo(v)) return null;
        Stack<Integer> path = new Stack<>();
        for (int x = v; x != s; x = edgeTo[x]) path.push(x);
        path.push(s);
        return path;
    }

    public int count() {
        return count;
    }

    private void dfs(Graph G, int v) {
        marked[v] = true;
        count++;
        for (int w : G.adj(v)) {
            if (!marked[w]) dfs(G, w);
        }
    }
}

BFS广度优先遍历

public class BreadthFirstPaths {
    private boolean[] marked;
    private int[] edgeTo;
    private final int s;

    public BreadthFirstPaths(Graph G, int s) {
        marked = new boolean[G.getV()];
        edgeTo = new int[G.getV()];
        this.s = s;
        bfs(G, s);
    }

    public boolean hasPathTo(int v) {
        return marked[v];
    }

    public Iterable<Integer> pathTo(int v) {
        if (!hasPathTo(v)) return null;
        Stack<Integer> path = new Stack<>();
        for (int x = v; x != s; x = edgeTo[x]) path.push(x);
        path.push(s);
        return path;
    }

    private void bfs(Graph G, int v) {
        Queue<Integer> queue = new ConcurrentLinkedQueue<>();
        marked[s] = true;
        queue.offer(s);
        while (!queue.isEmpty()) {
            int tmp = queue.poll();
            for (int w : G.adj(tmp)) {
                if (!marked[w]) {
                    edgeTo[w] = v;
                    marked[w] = true;
                    queue.offer(w);
                }
            }
        }
    }
}

符号图

public class SymbolGraph {
    private Map<String, Integer> map;
    private String[] keys;
    private Graph G;

    public SymbolGraph(InputStream stream, String sp) throws IOException {
        map = new HashMap<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(stream));
        String data = null;
        while ((data = br.readLine()) != null) {
            String[] a = data.split(sp);
            for (int i = 0; i < a.length; i++) {
                if (!map.containsKey(a[i])) map.put(a[i], map.size());
            }
        }

        keys = new String[map.size()];
        for (String name : map.keySet()) {
            keys[map.get(name)] = name;
        }

        G = new Graph(map.size());
        while ((data = br.readLine()) != null) {
            String[] a = data.split(sp);
            int v = map.get(a[0]);
            for (int i = 1; i < a.length; i++) {
                G.addEdge(v, map.get(a[i]));
            }
        }
    }

    public Graph getG() {
        return G;
    }

    public int index(String s){ return map.get(s); }

    public String name(int v){ return keys[v]; }
}

相关文章

  • 无向图 图的表示方法:邻接表 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核心点是用队列存放当前搜索的点 用在有环图的时候需要存放...

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

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

  • 图的桥和割点

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

  • BFS及其应用

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

  • 图论小结

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

网友评论

    本文标题:无向图DFS和BFS

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