2
public static List<Vertex<Integer>> petersenGraph() {
    List<Vertex<Integer>> v = new ArrayList<Vertex<Integer>>();

    for (int i = 0; i < 10; i++) {
        v.add(new Vertex<Integer>(i));
    }

    int[][] edges =
    {{0,1}, {1,0}, {1,2}, {2,1}, {2,3}, {3,2}, {3,4}, {4,3}, {4,0}, {0,4},
    {5,6}, {6,5}, {6,7}, {7,6}, {7,8}, {8,7}, {8,9}, {9,8}, {9,5}, {5,9},
    {5,0}, {0,5}, {6,2}, {2,6}, {7,4}, {4,7}, {8,1}, {1,8}, {9,3}, {3,9}};

    for (int[] e : edges)
        v.get(e[0]).successors().add(v.get(e[1]));

    return v;
}

我了解所有内容,直到有 for which 迭代边缘。那里到底发生了什么?

e[0]编辑:为什么使用and访问它们e[1]?是e[0]第一个数字和e[1]第二个?

4

3 回答 3

1

啊,太丑了。

edge 是一个二维数组,所以它是一个 int 数组的数组。在实际定义中,它是一对数组。

(int[] e: edges) 的行只是意味着在每次迭代中, e 将成为不同的整数数组,因此在每次迭代中它是不同的对。

然后,e[0] 代表该对中的第一项,而 e[1] 代表另一个。所以第一个坐标用于查找一个顶点,然后发生了一些事情,第二个坐标被添加进来。没有看到顶点或不知道算法,它是不清楚的。

于 2009-01-28T02:01:11.450 回答
0

多维数组edges实际上是“数组的数组”。该for语句一次提取一个元素edges,每个元素edges都是一个int[].

所以第一次通过循环时, e 将是{0, 1}。将是第二次{1, 0}。将是第三次{1, 2}。等等。

于 2009-01-28T01:56:56.920 回答
0

它创建的图表上的维基百科页面是http://en.wikipedia.org/wiki/Petersen_graph

从外观上看,图中的边由 Vertex.successors 集合表示,edges数组用于构造图,使用第一个索引作为每个边的from节点,第二个索引作为to节点。

这也可以解释为什么每一对都跟着它的对立面,例如 {0,1}, {1,0},因为彼得森图是无向的,所以节点之间的连接必须在两个方向上表示。

于 2009-01-28T17:30:10.407 回答