关闭

【算法】最小生成树prim算法

597人阅读 评论(0) 收藏 举报
分类:

最小生成树也就是在带权无向图中选取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。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:254450次
    • 积分:5140
    • 等级:
    • 排名:第5353名
    • 原创:263篇
    • 转载:16篇
    • 译文:0篇
    • 评论:47条
    博客专栏
    最新评论