全部博文(471)
分类: C/C++
2012-05-09 08:38:53
关于prim算法
先把有的点放于一个集合(或者数组)里,这个集合里存放的是所有走过的点。初始值为0或者false表示还没有点
声明一个一维数组用于记录各点的权值[可理解为起始点到目标点的距离,
声明一个二维数组用于记录某点到某一点的权值,如果这两点不可达到,则设置为无穷大
邻接矩阵:map[][]
1->2 1->3 1->4
|
0 |
1 |
2 |
3 |
4 |
5 |
0 |
|
|
|
|
|
|
1 |
|
MAX |
1 |
1 |
1 |
MAX |
2 |
|
MAX |
MAX |
MAX |
MAX |
1 |
3 |
|
MAX |
MAX |
MAX |
MAX |
1 |
4 |
|
MAX |
MAX |
MAX |
MAX |
1 |
5 |
|
MAX |
MAX |
MAX |
MAX |
|
具体执行过程:
1、先从某一点开始,把这一个开始的点放于声明的一个数组或者集合里,isvisit[]表明这一点已经被访问过令到对称矩阵不会被访问,而且初始化的时候也不初始成对称矩阵,只是初始成上图。
再看下图,从下图分析:
1、
先选取一个点作起始点,然后选择它邻近的权值最小的点(如果有多个与其相连的相同最小权值的点,随便选取一个)。如1作为起点。
isvisited[1]=1; //表明把1加进来说明是已经访问过
pos=1; //记录该位置
//用dist[]数组不断刷新最小权值,dist[i](0
dist[1]=0; //起始点i到邻近点的最小距离为0
dist[2]=map[pos][2]=4;
dist[3]=map[pos][3]=2;
dist[4]==map[pos][4]=3;
dist[5]=map[pos][5]=MaxInt; //无法直达
dist[6]=map[pos][6]=MaxInt;
2、
再在伸延的点找与它邻近的两者权值最小的点。
//dist[]以3作当前位置进行更新
isvisited[3]=1;
pos=3;
dist[1]=0; //已标记,不更新
dist[2]=map[pos][2]=4; //比5小,不更新
dist[3]=2; //已标记,不更新
dist[4]=map[pos][4]=3; //比1大,更新
dist[5]=map[pos][5]=MaxInt;
dist[6]=map[pos][6]=MaxInt;
3、最后的结果:
当所有点都连同后,结果最生成树如上图所示。
所有权值相加就是最小生成树,其值为2+1+2+4+3=12。