java實現Kruskal算法
源代碼
圖的結構java實現
Kruskal
public class Kruskal {
private static final int INF = Integer.MAX_VALUE;
/**
* 初始化距離矩陣
*
* @param graph 圖
* @return 距離矩陣
*/
private static int[][] initDistance(GraphMatrix graph) {
int vertexNum = graph.getVertexNum();
int[][] result = new int[vertexNum][vertexNum];
// 初始化距離矩陣
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < vertexNum; j++) {
result[i][j] = graph.edges[i][j];
if (i != j && result[i][j] == 0) {
result[i][j] = INF;
}
}
}
return result;
}
private static void kruskal(GraphMatrix graph) {
//頂點個數
int num = graph.getVertexNum();
//存放對應頂點所在連通圖標識
int[] group = new int[num];
int sum = 0, n1 = 0, n2 = 0;
boolean finished = false;
int groupNum = 1;
int[][] distance = initDistance(graph);
while (!finished) {
System.out.print("group:");
for (int i : group) {
System.out.print(i + " ");
}
System.out.println();
int min = INF;
//找出所有邊中最小值
for (int i = 0; i < num; i++) {
for (int j = i + 1; j < num; j++) {
if (distance[i][j] > 0 && distance[i][j] < min) {
//如果group相同,則表示處理過,不相同或都爲0都表示沒處理過
if (group[i] != group[j] || (group[i] == 0 && group[j] == 0)) {
min = distance[i][j];
n1 = i;
n2 = j;
}
}
}
}
if (min == INF) {
continue;
}
System.out.println(graph.vertexList.get(n1) + "->" + graph.vertexList.get(n2) + " " + min);
sum += min;
//找到了最小值,設置連通標記
if (group[n1] == 0 && group[n2] == 0) {
group[n1] = groupNum;
group[n2] = groupNum;
groupNum++;
} else if (group[n1] > 0 && group[n2] > 0) {
int tmp = group[n2];
for (int i = 0; i < group.length; i++) {
if (group[i] == tmp) {
group[i] = group[n1];
}
}
} else if (group[n1] == 0) {
group[n1] = group[n2];
} else {
group[n2] = group[n1];
}
//檢測是否完成
finished = true;
for (int aGroup : group) {
if (aGroup != group[0]) {
finished = false;
break;
}
}
}
System.out.println("sum:" + sum);
}
public static void main(String[] args) {
GraphMatrix<String> graph = new GraphMatrix<>("ABCDEF");
graph.addEdge("A", "B", 6);
graph.addEdge("A", "C", 1);
graph.addEdge("A", "D", 5);
graph.addEdge("B", "C", 5);
graph.addEdge("B", "E", 3);
graph.addEdge("C", "D", 5);
graph.addEdge("C", "E", 6);
graph.addEdge("C", "F", 4);
graph.addEdge("D", "F", 2);
graph.addEdge("E", "F", 6);
graph.information();
kruskal(graph);
}
}
log
頂點信息:
A B C D E F
邊表:
A<->B B<->A A<->C C<->A A<->D D<->A B<->C C<->B B<->E E<->B C<->D D<->C C<->E E<->C C<->F F<->C D<->F F<->D E<->F F<->E
邊的權重表:
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
group:0 0 0 0 0 0
A->C 1
group:1 0 1 0 0 0
D->F 2
group:1 0 1 2 0 2
B->E 3
group:1 3 1 2 3 2
C->F 4
group:1 3 1 1 3 1
B->C 5
sum:15