文章目录
Prim算法(java)
设N=(V, E)是连通网,T=(U,E1)是正在构造的生成树。刚开始。这棵树只有一个顶点,没有边(假设从1开始)U={1}, E1={}。在所有u属于U,v属于V-U中,选一条代价最小的边(u,v)并入T中,U={1,3}, E1={(1,3)},依次执行,直到V=U为止,即得到最小生成树T
如下图,先从1开始选择邻近最小的3,然后选择6···依次比较下去
需要注意的是下一条边是已选择的点与未选择的点之间连接的最小代价的边
输入
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
输出
closest[3]=1
closest[6]=3
closest[4]=6
closest[2]=3
closest[5]=2
下面贴上代码
import java.util.Arrays;
import java.util.Scanner;
public class prim {
public static void main(String args[ ]){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int[][] cost = new int[n+1][n+1];
for(int i = 1; i<n+1; i++){
Arrays.fill(cost[i], Integer.MAX_VALUE);
}
for(int i = 0; i<m; i++){
int x = scanner.nextInt();
int y = scanner.nextInt();
int p = scanner.nextInt();
cost[x][y] = cost[y][x] = p;
}
prim(cost, n, Integer.MAX_VALUE);
}
public static void prim(int[][] cost, int n, int maxi){
int lowcost[] = new int[n+1];
int closest[] = new int[n+1];
for(int i = 2; i<n+1; i++){
lowcost[i] = cost[1][i];
closest[i] = 1;
}
int min, m;
//寻找邻近最小路径
for(int i = 2; i<n+1; i++){
min = maxi;
m = 1;
for(int j = 2; j<n+1; j++){
if(lowcost[j] < min && lowcost[j] != 0){
m = j;
min = lowcost[j];
}
}
//输出生成树的边
System.out.println("closest[" + m + "]=" + closest[m]);
lowcost[m] = 0;
closest[m] = 0;
//调整代价
for(int j = 2; j<n+1; j++){
if(cost[m][j] < lowcost[j] && cost[m][j] != 0){
lowcost[j] = cost[m][j];
closest[j] = m;
}
}
}
}
}