В мире теории графов и сетевого анализа алгоритм Борувки — это хорошо известный алгоритм, который находит минимальное связующее дерево (MST) связного взвешенного графа. В этой статье блога мы углубимся в алгоритм Борувки и рассмотрим различные методы его реализации на Java. По ходу дела мы будем предоставлять примеры кода, которые помогут вам лучше понять концепцию.
Понимание алгоритма Борувки:
Алгоритм Борувки использует подход «разделяй и властвуй» для поиска минимального связующего дерева. Он начинается с того, что каждая вершина графа рассматривается как отдельный компонент, и итеративно объединяет компоненты, пока не останется только один компонент. На каждой итерации алгоритм выбирает самое дешевое ребро для каждого компонента и добавляет его в MST. Этот процесс продолжается до тех пор, пока не останется только один компонент, в результате чего будет получен окончательный MST.
Метод 1: Представление в матрице смежности
Один из способов реализации алгоритма Борувки — использование матрицы смежности для представления графа. Вот пример фрагмента кода:
public class BoruvkaAlgorithm {
public static void boruvkaMST(int[][] graph, int V) {
// Initialize arrays to store the minimum weight and selected edge
int[] cheapest = new int[V];
int[] parent = new int[V];
int[] minWeight = new int[V];
// Initialize all arrays
for (int i = 0; i < V; i++) {
cheapest[i] = -1;
parent[i] = -1;
minWeight[i] = Integer.MAX_VALUE;
}
// Number of components in MST
int numTrees = 0;
// Keep merging components until there is only one component
while (numTrees > 1) {
// Traverse each edge
for (int v = 0; v < V; v++) {
int root = find(v, parent);
for (int u = 0; u < V; u++) {
if (graph[v][u] != 0) {
int rootU = find(u, parent);
if (root != rootU) {
if (minWeight[root] == Integer.MAX_VALUE || graph[v][u] < minWeight[root]) {
minWeight[root] = graph[v][u];
cheapest[root] = u;
}
if (minWeight[rootU] == Integer.MAX_VALUE || graph[v][u] < minWeight[rootU]) {
minWeight[rootU] = graph[v][u];
cheapest[rootU] = v;
}
}
}
}
}
// Add the selected edges to MST
for (int i = 0; i < V; i++) {
if (cheapest[i] != -1) {
int rootV = find(i, parent);
int rootU = find(cheapest[i], parent);
if (rootV != rootU) {
System.out.println("Edge: " + i + "-" + cheapest[i] + " Weight: " + minWeight[i]);
union(rootV, rootU, parent);
numTrees--;
}
}
}
}
}
// Find the root of the component
public static int find(int node, int[] parent) {
if (parent[node] == -1)
return node;
return find(parent[node], parent);
}
// Union of two components
public static void union(int root1, int root2, int[] parent) {
parent[root1] = root2;
}
public static void main(String[] args) {
int[][] graph = {
{0, 2, 0, 6, 0},
{2, 0, 3, 8, 5},
{0, 3, 0, 0, 7},
{6, 8, 0, 0, 9},
{0, 5, 7, 9, 0}
};
int V = graph.length;
boruvkaMST(graph, V);
}
}
Алгоритм Борувки обеспечивает эффективный подход к поиску минимального остовного дерева графа. В этой статье мы исследовали один метод реализации алгоритма Борувки с использованием представления матрицы смежности в Java. Поняв пример кода и основные концепции, вы сможете применить алгоритм Борувки для решения аналогичных задач обработки графов.