問題:--------------------------------------------------------------------------------------
1) 為何兩個for循環(huán)都是從下標2開始的?尤其是第二個想不通。
答:因為Prim算法可以任選起點,通常選定點1為起點,也就是說點1一開始就在U里面了,自然不必出現(xiàn)在第二個循環(huán)(在V-U中尋找點)中。
2) lowcost數(shù)組顧名思義知道是存放最小代價信息的數(shù)組,但是具體的說lowcost放著是什么的最小代價,比如“l(fā)owcost[i]=c[1][i];”表示的是什么意思(我要帶i的語言描述)?
答:存放的是當前從點集U到點集V-U的最短邊長,lowcost[i] = c[1][i]是初始化,開始時點集U中只有點1,因此當前點集U到點集V-U的各最短邊長lowcost[i]就等于點1到點i的邊權(quán)。
3) closest[i]=1 又是什么含意呢?
答:closest[i]記錄對應lowcost[i]的邊的起點,因為lowcost[i]是當前終點為i的各條邊中的最小值,再加上一個closest[i]記錄起點,就能確定最小生成樹的邊了。closest[i] = 1是初始化,自然每一個邊都是從點1出發(fā)的。
4) 求教第二個for循環(huán)的整層循環(huán)是寫什么,我要每一行的注釋。到底是在作什么??
答:
for (i=2;i<=n;i++) /*從U之外求離U中某一頂點最近的頂點*/
{
min=MAXCOST; // 這一段是在U之外找最小值,closest[j] != 0表示是U之外
j=1;
k=i;
while (j<=n)
{
if(lowcost[j] { min=lowcost[j]; k=j; } j++; } printf("(%d,%d)",closest[k],k); /*打印邊,這里就看出closest[k]的用途了嘛*/ closest[k]=0; /*將點k加入集合U */ for(j=2;j<=n;j++) //更新最短邊和相應起點 { if (closest[j]!=0&& c[k][j] { lowcost[j]=c[k][j]; //更新最小權(quán)值 closest[j]=k; //記錄新邊的起點 } } }
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |