如何构建一个连续图的任意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分离?
答案 0 :(得分:0)
如果所有顶点均匀度,则可以创建Eularian路径(http://en.wikipedia.org/wiki/Eulerian_path)。
在eularian路径中,您可以拆分多次访问的每个顶点(即具有两个以上的边)。分割时确保图形保持连接。