如何构造一个连续图的任意2-regular分离,其顶点都是偶数度的?

时间:2015-05-19 13:47:18

标签: java algorithm data-structures graph graph-theory

TL; DR

如何构建一个连续图的任意2-regular分离,其顶点都是偶数度?适当的算法,数据结构?伪?任何实际的实施?

解释

D1 :如果H的每个顶点都有2度,则图表H将被称为 2-regular

D2 :图形G的分离 H是通过将一些顶点分割成多个顶点并从任意方式共享事件边缘而从G获得的图形在子系列中(见Figure 1)。

问题:我想用Java编写一个程序来构造一个连接图G的任意2-regular offchment H,其顶点都是偶数度的(参见Figure 2)。

到目前为止我做了什么

我搜索了伪代码和实际实现,但除了以下定理之外我没有找到任何相关的内容:“给定连接图G,其顶点都是偶数度, G的边集可以是划分为周期,其中没有两个共享边缘“。下面的定理也有建设性的证据。我不确定斜体的句子是否等同于我正在寻找的“任意2-regular detachment”。他们看起来和我一样。我们将不胜感激。

证明(简而言之):选择G的顶点u。通过在每个步骤遍历任何尚未遍历的边缘,从u开始生成轨迹T.继续这条路径,直到我们到达我们之前遇到过的顶点v(v可能是或者可能不是与u相同的顶点)。两个v的出现之间的轨迹边缘必须形成一个循环。将此循环称为C1。如果C1覆盖了G的所有边缘,那么我们就完成了。否则,从图G中移除形成C1的边,留下图G1。在G1中选择一些顶点u'。重复与以前相同的过程。生成一个循环C2。如果C2覆盖了G的所有其余边缘,那么我们就完成了。否则,从图形G1中移除形成C2的边缘,留下图形G2。我们继续用这种方式,直到我们用完了G的所有边缘。这时我们有多个循环C1,C2,...,Ck,它们之间包含G的所有边缘,但没有两个有一个共同的优势。

由于证明是建设性的,我在一些证明步骤后用Java编写了一个程序(参见 generateCycle())。 此外,我从图表中删除了遍历的所有边。我使用图2 中显示的图表作为输入。在正确性(一些输出不正确),复杂性(选择适当的数据结构,算法),设计等方面仍有改进的余地。再次,正如我之前所说,我不确定这种方法是否总是构造一个< em>任意2-regular offchment 。

Graph.java

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Graph<V> {
    Set<V> vertices = new HashSet<V>();
    Map<V, Set<V>> edges = new HashMap<V, Set<V>>();

    public void addEdge(V v1, V v2) {
        vertices.add(v1);
        vertices.add(v2);
        Set<V> e1 = edges.get(v1);
        if(e1 == null) {
            e1 = new HashSet<V>();
            edges.put(v1, e1);
        }
        e1.add(v2);
        Set<V> e2 = edges.get(v2);
        if(e2 == null) {
            e2 = new HashSet<V>();
            edges.put(v2, e2);
        }
        e2.add(v1);
    }

    public void removeEdge(V v1, V v2) {
        Set<V> e1 = edges.get(v1);
        e1.remove(v2);
        if(e1.isEmpty()) {
            edges.remove(v1);
            vertices.remove(v1);
        }
        Set<V> e2 = edges.get(v2);
        e2.remove(v1);
        if(e2.isEmpty()) {
            edges.remove(v2);
            vertices.remove(v2);
        }
    }

    public Set<V> getNeighbors(V v) {
        return edges.get(v);
    }
}

Main.java

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class Main {
    public static <V> ArrayList<V> generateCycle(Graph<V> graph, V start) {
        V current = start;
        ArrayList<V> trail = new ArrayList<V>();
        ArrayList<V> cycle = new ArrayList<V>();
        boolean metBefore = false;
        while (!metBefore) {
            trail.add(current);
            Set<V> neighbors = graph.getNeighbors(current);
            if (neighbors == null) {
                break;
            }
            V next = neighbors.iterator().next();
            graph.removeEdge(current, next);
            current = next;
            int index; // index of first occurrence
            if ((index = trail.indexOf(current)) != -1) {
                metBefore = true;
                for (int i = index; i < trail.size(); i++) {
                    cycle.add(trail.get(i));
                }
                cycle.add(current);
            }
        }
        return cycle;
    }

    public static void main(String... args) {
        Graph<String> g = new Graph<String>();
        g.addEdge("1", "2"); g.addEdge("2", "1");
        g.addEdge("1", "5"); g.addEdge("5", "1");
        g.addEdge("2", "5"); g.addEdge("5", "2");
        g.addEdge("2", "4"); g.addEdge("4", "2");
        g.addEdge("2", "3"); g.addEdge("3", "2");
        g.addEdge("3", "4"); g.addEdge("4", "3");
        g.addEdge("4", "5"); g.addEdge("5", "4");
        g.addEdge("4", "6"); g.addEdge("6", "4");
        g.addEdge("6", "5"); g.addEdge("5", "6");

        List<String> vertices = new ArrayList<String>();
        vertices.add("1"); vertices.add("2"); vertices.add("3");
        vertices.add("4"); vertices.add("5"); vertices.add("6");

        ArrayList<ArrayList<String>> cycles = new ArrayList<ArrayList<String>>();

        for (String v : vertices) {
            cycles.add(generateCycle(g, v));
        }

        System.out.println(cycles);
    }
}

输出:[[2,3,4,2],[],[],[4,5,6,4],[],[]]

显然,循环 [1,2,5,1] 缺失,因为我在生成路径1-&gt; 1-2 > 2-> 3-> 4-> 2. 输出不正确。

那么,我怎样才能构建G的任意2-regular分离?

1 个答案:

答案 0 :(得分:0)

如果所有顶点均匀度,则可以创建Eularian路径(http://en.wikipedia.org/wiki/Eulerian_path)。

在eularian路径中,您可以拆分多次访问的每个顶点(即具有两个以上的边)。分割时确保图形保持连接。