« findConnectedComponents |Main| 選択範囲の行頭の余計な空白を取り除く »

« [Jython]Javaで定義されたフィールドを名前の文字列で取得する方法 | Java | »

Javaでグラフの連結成分を求める

Pythonで書いた findConnectedComponentsの連結成分を求めている部分をJavaに移植したもの。ほぼ同じですね。誰の言葉か忘れたのだけどもJava1.5はLLのようです。 Python版と一番大きく異なるのは型の情報があることで、たとえばPython版では僕の頭の中にしか「componentsは頂点のリストのリスト」という情報がなかったのが、Java版では「Vector<Vector<IVertex>> components」と明記されています。とすると、Java版の方がアルゴリズムの理解のしやすさは上なのかも知れないですね…。むむむ。Pythonでアルゴリズムを書くときもコメントか何かで型を書いておいた方がいいのかなぁ?
// 隣接リストを作る
Hashtable<IVertex, Vector> adjDict = new Hashtable();
for(IVertex v: vertexDict.values()){
    adjDict.put(v, new Vector());
}
for(IEdge e: edgeDict.values()){
    IVertex v1 = e.getV1();
    IVertex v2 = e.getV2();
    adjDict.get(v1).add(v2);
    adjDict.get(v2).add(v1);
}
// 連結成分を求める
Vector<IVertex> visited = new Vector();
Vector<Vector<IVertex>> components = new Vector();
for(IVertex v: vertexDict.values()){
    if(visited.contains(v)){
        continue;
    }
    Vector<IVertex> aComp = new Vector();
    Vector<IVertex> queue = new Vector();
    queue.add(v);
    while(queue.size() > 0){
        Vector<IVertex> newQueue = new Vector();
        for(IVertex current: queue){
            visited.add(current);
            aComp.add(current);
            Vector<IVertex> neighbors = adjDict.get(current);
            for(IVertex neighbor: neighbors){
                if(!visited.contains(neighbor) && !newQueue.contains(neighbor)){
                    newQueue.add(neighbor);
                }
            }
        }
        queue = newQueue;
    }
    components.add(aComp);
}

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/422

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.