8.5 恷弌伏撹峯!更夛恷弌伏撹峯議Prim麻隈
邪譜G??V?E?葎匯利夕?凪嶄V 葎利夕嶄侭嗤競泣議鹿栽?E 葎利夕嶄侭嗤揮幡円議鹿栽。譜崔曾倖仟議鹿栽U 才T?凪嶄鹿栽U 喘噐贋慧G 議恷弌伏撹峯嶄議競泣?鹿栽T 贋慧G 議恷弌伏撹峯嶄議円。綜鹿栽U 議兜峙葎U?{u1}?邪譜更夛恷弌伏撹峯扮?貫競泣u1 竃窟??鹿栽T 議兜峙葎T?{}。Prim 麻隈議房?頁?貫侭嗤u∈U?v∈V?U 議円嶄?僉函醤嗤恷弌幡峙議円?u?v??繍競泣v 紗秘鹿栽U 嶄?繍円?u?v?紗秘鹿栽T 嶄?泌緩音僅嶷鹸?岷欺U?V 扮?恷弌伏撹峯更夛頼穎?宸扮鹿栽T 嶄淫根阻恷弌伏撹峯議侭嗤円。
Prim 麻隈辛喘和峰狛殻宙峰?凪嶄喘wuv 燕幣競泣u 嚥競泣v 円貧議幡峙。
?1?U?{u1},T={};
?2?while (U≠V)do
(u?v)?min{wuv?u∈U?v∈V?U }
T?T?{(u?v)}
U?U?{v}
?3?潤崩。
夕8.23 (a)侭幣議匯倖利夕?梓孚Prim 圭隈?貫競泣1 竃窟?乎利議恷弌伏撹峯議恢伏狛殻泌夕8.23 (b)、(c)、(d)、(e)、(f)才(g)侭幣。
葎糞孖Prim 麻隈?俶譜崔曾倖絹廁匯略方怏lowcost 才closevert?凪嶄lowcost 喘栖隠贋鹿栽V?U 嶄光競泣嚥鹿栽U 嶄光競泣更撹議円嶄醤嗤恷弌幡峙議円議幡峙?方怏closevertex 喘栖隠贋卆現噐乎円議壓鹿栽U 嶄議競泣。邪譜兜兵彜蓑扮?U?{u1}(u1 葎竃窟議競泣)?宸扮嗤lowcost[0]=0?万燕幣競泣u1 厮紗秘鹿栽U 嶄?方怏lowcost 議凪万光蛍楚議峙頁競泣u1 欺凪噫光競泣侭更撹議岷俊円議幡峙。隼朔音僅僉函幡峙恷弌議円?ui?uk??ui∈U?uk∈V?U??耽僉函匯訳円?祥繍lowcost?k?崔葎0?燕幣競泣uk 厮紗秘鹿栽U 嶄。喇噐競泣uk 貫鹿栽V?U 序秘鹿栽U 朔?宸曾倖鹿栽議坪否窟伏阻延晒?祥俶卆象醤悶秤趨厚仟方怏lowcost 才closevertex 嶄何蛍蛍楚議坪否。恷朔closevertex 嶄軸葎侭秀羨議恷弌伏撹峯。
輝涙?利寡喘屈略方怏贋刈議惣俊裳專贋刈扮?Prim 麻隈議C 囂冱糞孖葎?
void Prim?int gm[ ][MAXNODE]?int n?int closevertex[ ]?
{/*喘Prim 圭隈秀羨嗤n 倖競泣議惣俊裳專贋刈潤更議利夕gm 議恷弌伏撹峯*/
/*貫會催葎0 議競泣竃窟?秀羨議恷弌伏撹峯贋噐方怏closevertex 嶄*/
int lowcost[100],mincost;
int i,j,k;
for (i=1;i<n;i++) /*兜兵晒*/
{ lowcost[i]=gm[0][i];
closevertex[i]=0;
}
lowcost[0]=0; /*貫會催葎0 議競泣竃窟伏撹恷弌伏撹峯*/
closevertex[0]=0;
for (i=1;i<n;i++) /*儖孀輝念恷弌幡峙議円議競泣*/
{mincost=MAXCOST; /*MAXCOST 葎匯倖自寄議械楚峙*/
j=1;k=1;
while (j<n)
{ if (lowcost[j]<mincost && lowcost[j]!=0)
{ mincost=lowcost[j];
k=j;
}
j++;
}
printf(“競泣議會催?%d 円議幡峙?%d\n”,k,mincost);
lowcost[k]=0;
for (j=1;j<n;j++) /*俐個凪万競泣議円議幡峙才恷弌伏撹峯競泣會催*/
if (gm[k][j]<lowcost[j])
{ lowcost[j]=gm[k][j];
closevertex[j]=k;
}
}
}
麻隈8.14
夕8.24 公竃阻壓喘貧峰麻隈更夛利夕8.23 (a)議恷弌伏撹峯議狛殻嶄?方怏closevertex、lowcost 式鹿栽U?V?U 議延晒秤趨?響宀辛序匯化紗侮斤Prim 麻隈議阻盾。
壓Prim 麻隈嶄?及匯倖for 儉桟議峇佩肝方葎n?1?及屈倖for 儉桟嶄嗽淫凄阻匯倖while 儉桟才匯倖for 儉桟?峇佩肝方葎2(n-1)2?侭參Prim 麻隈議扮寂鹸墫業葎O(n2)。
Prim 麻隈辛喘和峰狛殻宙峰?凪嶄喘wuv 燕幣競泣u 嚥競泣v 円貧議幡峙。
?1?U?{u1},T={};
?2?while (U≠V)do
(u?v)?min{wuv?u∈U?v∈V?U }
T?T?{(u?v)}
U?U?{v}
?3?潤崩。
夕8.23 (a)侭幣議匯倖利夕?梓孚Prim 圭隈?貫競泣1 竃窟?乎利議恷弌伏撹峯議恢伏狛殻泌夕8.23 (b)、(c)、(d)、(e)、(f)才(g)侭幣。
葎糞孖Prim 麻隈?俶譜崔曾倖絹廁匯略方怏lowcost 才closevert?凪嶄lowcost 喘栖隠贋鹿栽V?U 嶄光競泣嚥鹿栽U 嶄光競泣更撹議円嶄醤嗤恷弌幡峙議円議幡峙?方怏closevertex 喘栖隠贋卆現噐乎円議壓鹿栽U 嶄議競泣。邪譜兜兵彜蓑扮?U?{u1}(u1 葎竃窟議競泣)?宸扮嗤lowcost[0]=0?万燕幣競泣u1 厮紗秘鹿栽U 嶄?方怏lowcost 議凪万光蛍楚議峙頁競泣u1 欺凪噫光競泣侭更撹議岷俊円議幡峙。隼朔音僅僉函幡峙恷弌議円?ui?uk??ui∈U?uk∈V?U??耽僉函匯訳円?祥繍lowcost?k?崔葎0?燕幣競泣uk 厮紗秘鹿栽U 嶄。喇噐競泣uk 貫鹿栽V?U 序秘鹿栽U 朔?宸曾倖鹿栽議坪否窟伏阻延晒?祥俶卆象醤悶秤趨厚仟方怏lowcost 才closevertex 嶄何蛍蛍楚議坪否。恷朔closevertex 嶄軸葎侭秀羨議恷弌伏撹峯。
輝涙?利寡喘屈略方怏贋刈議惣俊裳專贋刈扮?Prim 麻隈議C 囂冱糞孖葎?
void Prim?int gm[ ][MAXNODE]?int n?int closevertex[ ]?
{/*喘Prim 圭隈秀羨嗤n 倖競泣議惣俊裳專贋刈潤更議利夕gm 議恷弌伏撹峯*/
/*貫會催葎0 議競泣竃窟?秀羨議恷弌伏撹峯贋噐方怏closevertex 嶄*/
int lowcost[100],mincost;
int i,j,k;
for (i=1;i<n;i++) /*兜兵晒*/
{ lowcost[i]=gm[0][i];
closevertex[i]=0;
}
lowcost[0]=0; /*貫會催葎0 議競泣竃窟伏撹恷弌伏撹峯*/
closevertex[0]=0;
for (i=1;i<n;i++) /*儖孀輝念恷弌幡峙議円議競泣*/
{mincost=MAXCOST; /*MAXCOST 葎匯倖自寄議械楚峙*/
j=1;k=1;
while (j<n)
{ if (lowcost[j]<mincost && lowcost[j]!=0)
{ mincost=lowcost[j];
k=j;
}
j++;
}
printf(“競泣議會催?%d 円議幡峙?%d\n”,k,mincost);
lowcost[k]=0;
for (j=1;j<n;j++) /*俐個凪万競泣議円議幡峙才恷弌伏撹峯競泣會催*/
if (gm[k][j]<lowcost[j])
{ lowcost[j]=gm[k][j];
closevertex[j]=k;
}
}
}
麻隈8.14
夕8.24 公竃阻壓喘貧峰麻隈更夛利夕8.23 (a)議恷弌伏撹峯議狛殻嶄?方怏closevertex、lowcost 式鹿栽U?V?U 議延晒秤趨?響宀辛序匯化紗侮斤Prim 麻隈議阻盾。
壓Prim 麻隈嶄?及匯倖for 儉桟議峇佩肝方葎n?1?及屈倖for 儉桟嶄嗽淫凄阻匯倖while 儉桟才匯倖for 儉桟?峇佩肝方葎2(n-1)2?侭參Prim 麻隈議扮寂鹸墫業葎O(n2)。