-1

開始ノードから到達可能なすべてのノードを検出しようとしています。

ベースケースに到達していないようですが、理由はわかりません。

私のコード:

class Vertex {
    public final String name;
    public int found;
    public Edge[] adjacencies;
    public Vertex(String argName) { name = argName; found = 0;}
}

class Edge {
    public final Vertex target;
    public Edge(Vertex argTarget, double argWeight) { target = argTarget; weight = argWeight; }
}

ArrayList<Vertex> merge(ArrayList<Vertex> a, ArrayList<Vertex> b) {
    if(a == null) return b;
    if(b == null) return a;
    for(int x = 0; x < a.size(); x++)
        b.add(a.get(x));
        return b;
}

ArrayList<Vertex> span(Vertex b) {
    System.out.println("hello");
    if(b.found == 1) {
        return null;
    }
    ArrayList<Vertex> t = new ArrayList<Vertex>();
    t.add(b);
    b.found = 0;
    if(b.adjacencies == null) return t;
    for(int x = 0; x < b.adjacencies.length; x++) {
        ArrayList<Vertex> result = span(b.adjacencies[x].target);
        t = merge(t, result);
    }
    return t;
}

スタック オーバーフロー エラーが発生しました。再帰でスタックしているように見えますが、その理由はわかりません。

注:これは私が実行しているグラフです。

Vertex v0 = new Vertex("Redvile");
Vertex v1 = new Vertex("Blueville");
Vertex v2 = new Vertex("Greenville");
Vertex v3 = new Vertex("Orangeville");
Vertex v4 = new Vertex("Purpleville");

v0.adjacencies = new Edge[]{ new Edge(v1, 5), new Edge(v2, 10), new Edge(v3, 8) };
v1.adjacencies = new Edge[]{ new Edge(v0, 5), new Edge(v2, 3), new Edge(v4, 7) };
v2.adjacencies = new Edge[]{ new Edge(v0, 10), new Edge(v1, 3) };
v3.adjacencies = new Edge[]{ new Edge(v0, 8), new Edge(v4, 2) };
v4.adjacencies = new Edge[]{ new Edge(v1, 7), new Edge(v3, 2) };
4

2 に答える 2

1

found を 1 に設定したことはありません。おそらく 1 を意味するときに 0 に設定しただけです。また、found にはブール値を使用します。また、ArrayLists に addAll を使用し、null の代わりに Collections.emptyList を返します。

于 2012-11-30T21:40:26.003 に答える
1

この単純なグラフを考えると:

頂点A <---------------> 頂点B

頂点 A をスパンに。found==0 なので、続けて t に追加し、found=0 に設定します。隣接関係は 1 つです -- 次に、span(頂点 b) を呼び出します

頂点 B をスパンに。found==0 なので、続けて t に追加し、found=0 に設定します。隣接関係は 1 つです -- 次に、span(頂点 a) を呼び出します

頂点 A をスパンに。found==0 なので、続けて t に追加し、found=0 に設定します。隣接関係は 1 つです -- 次に、span(頂点 b) を呼び出します

問題は、found を 0 ではなく 1 に設定する必要があることだと思います。

(VertexA を「Redville」に、VertexB を「Blueville」に置き換えて、例に合わせてください)

于 2012-11-30T21:43:01.347 に答える