一尘不染

在唐纳德·B·约翰逊算法的帮助下,我无法理解伪代码(PART II)

algorithm

我不理解唐纳德·约翰逊(Donald Johnson)发表的有关在图形中查找循环(​​电路)的论文的某些部分。

更具体地说,我不明白伪代码的以下行中提到的矩阵Ak是什么:

Ak:=由{s,s + 1,.... n}引起的在G的子图中具有最小顶点的强分量K的邻接结构;

使事情变得更糟的是,在没有声明Vk是什么的情况下,在mentins中“我在Vk中要做”。

据我所知,我们有以下内容:1)通常,一个强大的组件是图的一个子图,其中对于该子图的每个节点,都有一条通往该子图的任何节点的路径(换句话说,您可以从子图的任何其他节点访问子图的任何节点)

2)由节点列表 引起 的子图是包含所有这些节点以及连接这些节点的所有边的图。在论文中,数学定义为“如果W是V的子集且F =(W中的W,{u,y)|
u,y和E中的(u,y)},则F是W诱导的G的子图。其中,u是边,E是图中所有边的集合,W是节点的集合。

3)在代码实现中,节点由整数1 … n命名。

4)我 怀疑 Vk是强分量K的节点集。

现在到问题了。假设我们有一个图G =(V,E),其中V = {1,2,3,4,5,6,7,8,9},它可以分为3个强分量SC1 = {1, 4,7,8}
SC2 = {2,3,9} SC3 = {5,6}(及其边缘)

有人可以给我一个s = 1,s = 2,s = 5的例子吗,如果根据代码将其设为Vk和Ak呢?

伪代码是我在前面的问题中的理解唐纳德·B·约翰逊算法中的伪代码

先感谢您


阅读 181

收藏
2020-07-28

共1个答案

一尘不染

有用!在Johnson算法早期迭代中,我以为那是一个邻接矩阵。相反,它似乎表示一个邻接表。在该示例中,如下实现,顶点{a,b,c}被编号为{0,1,2},从而产生以下电路。A

附录:如本建议的编辑和有用的答案所述,算法指定unblock()应删除具有_值_ w的元素,而不是具有 索引 的元素w

list.remove(Integer.valueOf(w));

样本输出:

0 1 0
0 1 2 0
0 2 0
0 2 1 0
1 0 1
1 0 2 1
1 2 0 1
1 2 1
2 0 1 2
2 0 2
2 1 0 2
2 1 2

默认情况下,程序以s = 0;开头。s:=leastvertexinV仍然可以实现优化。这里显示仅产生唯一循环的变体。

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Stack;

    /**
     * @see http://dutta.csc.ncsu.edu/csc791_spring07/wrap/circuits_johnson.pdf
     * @see https://stackoverflow.com/questions/2908575
     * @see https://stackoverflow.com/questions/2939877
     * @see http://en.wikipedia.org/wiki/Adjacency_matrix
     * @see http://en.wikipedia.org/wiki/Adjacency_list
     */
    public final class CircuitFinding {

        final Stack<Integer> stack = new Stack<Integer>();
        final List<List<Integer>> a;
        final List<List<Integer>> b;
        final boolean[] blocked;
        final int n;
        int s;

        public static void main(String[] args) {
            List<List<Integer>> a = new ArrayList<List<Integer>>();
            a.add(new ArrayList<Integer>(Arrays.asList(1, 2)));
            a.add(new ArrayList<Integer>(Arrays.asList(0, 2)));
            a.add(new ArrayList<Integer>(Arrays.asList(0, 1)));
            CircuitFinding cf = new CircuitFinding(a);
            cf.find();
        }

        /**
         * @param a adjacency structure of strong component K with
         * least vertex in subgraph of G induced by {s, s + 1, n};
         */
        public CircuitFinding(List<List<Integer>> a) {
            this.a = a;
            n = a.size();
            blocked = new boolean[n];
            b = new ArrayList<List<Integer>>();
            for (int i = 0; i < n; i++) {
                b.add(new ArrayList<Integer>());
            }
        }

        private void unblock(int u) {
            blocked[u] = false;
            List<Integer> list = b.get(u);
            for (int w : list) {
                //delete w from B(u);
                list.remove(Integer.valueOf(w));
                if (blocked[w]) {
                    unblock(w);
                }
            }
        }

        private boolean circuit(int v) {
            boolean f = false;
            stack.push(v);
            blocked[v] = true;
            L1:
            for (int w : a.get(v)) {
                if (w == s) {
                    //output circuit composed of stack followed by s;
                    for (int i : stack) {
                        System.out.print(i + " ");
                    }
                    System.out.println(s);
                    f = true;
                } else if (!blocked[w]) {
                    if (circuit(w)) {
                        f = true;
                    }
                }
            }
            L2:
            if (f) {
                unblock(v);
            } else {
                for (int w : a.get(v)) {
                    //if (v∉B(w)) put v on B(w);
                    if (!b.get(w).contains(v)) {
                        b.get(w).add(v);
                    }
                }
            }
            v = stack.pop();
            return f;
        }

        public void find() {
            while (s < n) {
                if (a != null) {
                    //s := least vertex in V;
                    L3:
                    circuit(s);
                    s++;
                } else {
                    s = n;
                }
            }
        }
    }
2020-07-28