Karger的算法

时间:2015-08-08 23:09:03

标签: java algorithm graph-theory vertices edges

我正在尝试用Java实现min-cut Karger算法。为此,我创建了一个Graph类,它存储一个SortedMap,其中一个整数索引作为键,一个Vertex对象作为值,以及一个Edge对象的ArrayList。边缘存储其事件顶点的索引。比合并一些随机边缘的顶点,直到顶点数达到2.我重复这个步骤安全次数。奇怪的是,在我的输出中,我获得了2倍的交叉边缘数量。我的意思是,如果正确的答案是10,在执行n次算法后(n足够大),这些执行结果的最小值为20,这让我相信实现几乎是正确的。    这是代码的相关部分:

    void mergeVertex(int iV, int iW) {

    for (int i = 0; i < edges.size(); i++) {
        Edge e = edges.get(i);
        if (e.contains(iW)) {
            if (e.contains(iV)) {
                edges.remove(i);
                i--;
            } else {
                e.replace(iW, iV);
            }
        }
    }

    vertices.remove(iW);
}

public int kargerContraction(){

    Graph copy = new Graph(this);
    Random r = new Random();
    while(copy.getVertices().size() > 2){
        int i = r.nextInt(copy.getEdges().size());
        Edge e = copy.getEdges().get(i);
        copy.mergeVertex(e.getVertices()[0], e.getVertices()[1]);
    }

    return copy.getEdges().size()/2;
}

1 个答案:

答案 0 :(得分:1)

实际上问题比我想象的要简单得多。在读取包含图形数据的.txt时,我每个边缘计数两次,因此逻辑上minCut返回的是右边minCut的2倍。