当前位置:嗨网首页>书籍在线阅读

45-伪代码详解

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.7.4 伪代码详解

(1)初始化。s[1]=true,初始化数组closest,除了u0外其余顶点最邻近点均为u0,表示V−U中的顶点到集合U的最临近点均为u0;初始代数组lowcost,u0到V−U中的顶点的边值,无边相连则为∞(无穷大)。

s[u0] = true; //初始时,集合中U只有一个元素,即顶点u0
for(i = 1; i <= n; i++) 
{
     if(i != u0) //除u0之外的顶点
     {
          lowcost[i] = c[u0][i];   //u0到其它顶点的边值
          closest[i] = u0;  //最邻近点初始化为u0
          s[i] = false;  //初始化u0之外的顶点不属于U集合,即属于V-U集合
     }
      else
          lowcost[i] =0;
}

(2)在集合V−U中寻找距离集合U最近的顶点t。

int temp = INF;
int t = u0;
for(j = 1; j <= n; j++) //在集合中V-U中寻找距离集合U最近的顶点t
{
    if((!s[j]) && (lowcost[j] < temp)) //!s[j] 表示j结点在V-U集合中
    { 
        t = j;
        temp = lowcost[j];
    }
}
if(t == u0) //找不到t,跳出循环
   break;

(3)更新lowcost和closest数组。

s[t] = true;     //否则,讲t加入集合U
for(j = 1; j <= n; j++)  //更新lowcost和closest
{
    if((!s[j]) && (c[t][j] < lowcost[j])) // !s[j] 表示j结点在V-U集合中
                                          //t到j的边值小于当前的最邻近值
    {
         lowcost[j] = c[t][j]; //更新j的最邻近值为t到j的边值
         closest[j] = t;    //更新j的最邻近点为t
    }
}