Нахождение минимального значения графа с помощью алгоритма Крускала

Я новичок, и я пытаюсь найти минимальный срез графа, используя алгоритм Крускала в Java.

Я попал туда, где я могу прочитать входные данные и создать vertexCount^2 числа MST со случайными весами для ребер. Все, что мне осталось сделать, это выяснить из моего MST, сколько срезов требуется для разделения S и VS. Это позволит мне выбрать минимальное число вершин из числа ^ 2 вариантов.

Я думаю, что я правильно понимаю, что я должен игнорировать последний край MST, чтобы получить S и VS. Но я заблудился, как выяснить, сколько ребер соединяют S и VS.

Итак, мой вопрос: 1) Достаточно ли случайного MST vertexCount^2, чтобы быть уверенным, что он будет содержать минимальный срез? 2) Как я могу узнать, сколько ребер соединяют S и VS?

PS. Это фрагмент кода моего кода:

            // create weighted edge graph from input.txt
            int vertexCount, edgeCount;
            Edge edgeTemp;
            vertexCount = s.nextInt();
            edgeCount = s.nextInt();
            EdgeWeightedGraph G = new EdgeWeightedGraph(vertexCount, edgeCount);
            for (int j = 0; j < edgeCount; j++) {
                edgeTemp = new Edge(s.nextInt(), s.nextInt(), new Random().nextInt(edgeCount));
                G.addEdge(edgeTemp);
            }

            // create kruskal's mst from graph G
            for (int j = 0; j < vertexCount*vertexCount; j++) {
                KruskalMST mst = new KruskalMST(G);
                for (Edge e : mst.edges()) {
                    System.out.println(e);
                }
                System.out.println(NEWLINE);
                if (j != vertexCount*vertexCount - 2)
                    G.randomizeWeight(edgeCount);
            }  

PSS. В случае, если это уместно, я смотрел код из http://algs4.cs.princeton.edu/43mst/ при написании своего кода.

1 ответ

При получении MST из графика я использовал алгоритм Крускала. Это означает, что я должен был использовать union и найти методы.

Каждая вершина является своим собственным родителем в начале. Получая объединение различных компонентов из графа, я назначаю объединяющие компоненты (включая синглтоны) одному родителю. Таким образом, ко времени, когда у меня останутся S и VS, все вершины каждого компонента будут иметь одного и того же родителя!

Поэтому я возвращаюсь к своему EdgeWeightedGraph и перебираю все ребра на графике (не MST!). Когда я нахожу ребро, две вершины которого имеют разных родителей, это означает, что ребро соединяет компоненты S и VS. Я считаю ++ каждый раз, когда вижу такой край.

Это дает мне общее количество срезов, необходимых на графике!

Другие вопросы по тегам