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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值