最小生成树也就是在带权无向图中选取n-1条边,使得n个点都相互连通,而且距离最短。
具体的prim算法如下。
有一个无向图,顶点以及相互之间边以及权值如下。
在prim算法中,对于边和边之间会形成一个邻接矩阵。
int path[][] = new int[n+1][n+1];
for (int i = 1; i < n+1; i++) {
for (int j = 1; j < n+1; j++) {
path[i][j] = Integer.MAX_VALUE;
}
}
int minLen[] = new int[n+1];
int visit[] = new int[n+1];
for (int i = 1; i < n+1; i++) {
minLen[i] = path[1][i];
}
n为顶点个数。那么path[i][j]即为i和j之间的距离。初始化时声明为无穷大。
path[1][2] = path[2][1] = 1;
path[1][4] = path[4][1] = 2;
.......
输入数据时,如果有距离就更新。
minLen[]表示的是从1到其他边的距离。
visit[] 表示该点是否被访问过,这样可以防止走回头路。
1、初始顶点为s = 1。
minLen[s] = 0; 初始顶点到自己本身的距离为0;
minLen[2] = path[s][2] = 2;
minLen[3] = path[s][3] = 3;
minLen[4] = path[s][4] = 2;
minLen[5] = path[s][5] = 2;
找到和初始点s距离最短的顶点,这里为2,4,5,可以选取任意一个,这里我们选2。
2、选2结束以后。
visit[2] = 1;
minLen[s] = 0;//已访问,不更新
minLen[2] = path[1][2] = 2;//已访问,不更新
minLen[3] = path[1][3] = 1;// minLen[3] = 3 比 path[2][3] = 1大,更新为1;
minLen[4] = path[1][4] = 2;// minLen[4] = 2 比 path[2][4] 小,不更新;
minLen[5] = path[1][5] = 2;// minLen[5] = 2. 比 path[2][5] = Integer.MAXVALUE小,不更新;
3、不断更新。最后成为这样一棵树
就是最后的结果。距离最小为7。