8.5 恷弌伏撹峯!更夛恷弌伏撹峯議Kruskal麻隈
Kruskal 麻隈頁匯嶽梓孚利嶄円議幡峙弓奐議乏會更夛恷弌伏撹峯議圭隈。凪児云房?頁?譜涙?銭宥利葎G??V?E??綜G 議恷弌伏撹峯葎T?凪兜蓑葎T??V?{}??軸蝕兵扮?恷弌伏撹峯T 喇夕G 嶄議n 倖競泣更撹?競泣岻寂短嗤匯訳円?宸劔T 嶄光競泣光徭更撹匯倖銭宥蛍楚。隼朔?梓孚円議幡峙喇弌欺寄議乏會?深賀G 議円鹿E 嶄議光訳円。飛瓜深賀議円議曾倖競泣奉噐T 議曾倖音揖議銭宥蛍楚?夸繍緩円恬葎恷弌伏撹峯議円紗秘欺T 嶄?揖扮委曾倖銭宥蛍楚銭俊葎匯倖銭宥蛍楚?飛瓜深賀円議曾倖競泣奉噐揖匯倖銭宥蛍楚?夸普肇緩円?參窒夛撹指揃?泌緩和肇?輝T 嶄議銭宥蛍楚倖方葎1 扮?緩銭宥蛍楚宴葎G 議匯臣恷弌伏撹峯。
斤噐夕8.23(a)侭幣議利?梓孚Kruskal 圭隈更夛恷弌伏撹峯議狛殻泌夕8.25 侭幣。壓更夛狛殻嶄?梓孚利嶄円議幡峙喇弌欺寄議乏會?音僅僉函輝念隆瓜僉函議円鹿嶄幡峙恷弌議円。卆象伏撹峯議古廷?n 倖潤泣議伏撹峯?嗤n?1 訳円?絞郡鹸貧峰狛殻?岷欺僉函阻n?1 訳円葎峭?祥更撹阻匯臣恷弌伏撹峯。
和中初府Kruskal 麻隈議糞孖。
譜崔匯倖潤更方怏Edges 贋刈利嶄侭嗤議円?円議潤更窃侏淫凄更撹議競泣佚連才円幡峙?協吶泌和?
#define MAXEDGE <夕嶄議恷寄円方>
typedef struct {
elemtype v1;
elemtype v2;
int cost;
} EdgeType;
EdgeType edges[MAXEDGE];
壓潤更方怏edges 嶄?耽倖蛍楚edges[i]旗燕利嶄議匯訳円?凪嶄edges[i].v1 才edges[i].v2 燕幣乎円議曾倖競泣?edges[i].cost 燕幣宸訳円議幡峙。葎阻圭宴僉函輝念幡峙恷弌議円?並枠委方怏edges 嶄議光圷殆梓孚凪cost 囃峙喇弌欺寄議乏會電双。壓斤銭宥蛍楚栽旺扮?寡喘7.5.2 准侭初府議鹿栽議栽旺圭隈。斤噐嗤n 倖競泣議利?譜崔匯倖方怏father[n]?凪兜峙葎father[i]=-1?i?0?1?…?n?1??燕幣光倖競泣壓音揖議銭宥蛍楚貧?隼朔?卆肝函竃edges 方怏嶄議耽訳円議曾倖競泣?臥孀万断侭奉議銭宥蛍楚?邪譜vf1才vf2 葎曾競泣侭壓議峯議功潤泣壓father 方怏嶄議會催?飛vf1 音吉噐vf2?燕苧宸訳円議曾倖競泣音奉噐揖匯蛍楚?夸繍宸訳円恬葎恷弌伏撹峯議円補竃?旺栽旺万断侭奉議曾倖銭宥蛍楚。
和中喘C 囂冱糞孖Kruskal 麻隈?凪嶄痕方Find 議恬喘頁儖孀夕嶄競泣侭壓峯議功潤泣壓方怏father 嶄議會催。俶傍苧議頁?壓殻會嶄繍競泣議方象窃侏協吶撹屁侏?遇壓糞縞哘喘嶄?辛卆象糞縞俶勣栖譜協。
typedef int elemtype;
typedef struct {
elemtype v1;
elemtype v2;
int cost;
}EdgeType;
void Kruskal?EdgeType edges[ ]?int n?
/*喘Kruskal 圭隈更夛嗤n 倖競泣議夕edges 議恷弌伏撹峯*/
{ int father[MAXEDGE];
int i,j,vf1,vf2;
for (i=0;i<n;i++) father[i]=-1;
i=0;j=0;
while(i<MAXEDGE && j<n-1)
{ vf1=Find(father,edges[i].v1);
vf2=Find(father,edges[i].v2);
if (vf1!=vf2)
{ father[vf2]=vf1;
j++;
printf(“%3d%3d\n”,edges[i].v1,edges[i].v2);
}
i++;
}
}
麻隈8.15
int Find?int father[ ]?int v?
/*儖孀競泣v 侭壓峯議功潤泣*/
{ int t;
t=v;
while(father[t]>=0)
t=father[t];
return(t);
}
麻隈8.16
壓Kruskal 麻隈嶄?及屈倖while 儉桟頁唹峒扮寂丼楕議麼勣荷恬?凪儉桟肝方恷謹葎MAXEDGE 肝方?凪坪何距喘議Find 痕方議坪何儉桟肝方恷謹葎n?侭參Kruskal 麻隈議扮寂鹸墫業葎O?n·MAXEDGE?。
斤噐夕8.23(a)侭幣議利?梓孚Kruskal 圭隈更夛恷弌伏撹峯議狛殻泌夕8.25 侭幣。壓更夛狛殻嶄?梓孚利嶄円議幡峙喇弌欺寄議乏會?音僅僉函輝念隆瓜僉函議円鹿嶄幡峙恷弌議円。卆象伏撹峯議古廷?n 倖潤泣議伏撹峯?嗤n?1 訳円?絞郡鹸貧峰狛殻?岷欺僉函阻n?1 訳円葎峭?祥更撹阻匯臣恷弌伏撹峯。
和中初府Kruskal 麻隈議糞孖。
譜崔匯倖潤更方怏Edges 贋刈利嶄侭嗤議円?円議潤更窃侏淫凄更撹議競泣佚連才円幡峙?協吶泌和?
#define MAXEDGE <夕嶄議恷寄円方>
typedef struct {
elemtype v1;
elemtype v2;
int cost;
} EdgeType;
EdgeType edges[MAXEDGE];
壓潤更方怏edges 嶄?耽倖蛍楚edges[i]旗燕利嶄議匯訳円?凪嶄edges[i].v1 才edges[i].v2 燕幣乎円議曾倖競泣?edges[i].cost 燕幣宸訳円議幡峙。葎阻圭宴僉函輝念幡峙恷弌議円?並枠委方怏edges 嶄議光圷殆梓孚凪cost 囃峙喇弌欺寄議乏會電双。壓斤銭宥蛍楚栽旺扮?寡喘7.5.2 准侭初府議鹿栽議栽旺圭隈。斤噐嗤n 倖競泣議利?譜崔匯倖方怏father[n]?凪兜峙葎father[i]=-1?i?0?1?…?n?1??燕幣光倖競泣壓音揖議銭宥蛍楚貧?隼朔?卆肝函竃edges 方怏嶄議耽訳円議曾倖競泣?臥孀万断侭奉議銭宥蛍楚?邪譜vf1才vf2 葎曾競泣侭壓議峯議功潤泣壓father 方怏嶄議會催?飛vf1 音吉噐vf2?燕苧宸訳円議曾倖競泣音奉噐揖匯蛍楚?夸繍宸訳円恬葎恷弌伏撹峯議円補竃?旺栽旺万断侭奉議曾倖銭宥蛍楚。
和中喘C 囂冱糞孖Kruskal 麻隈?凪嶄痕方Find 議恬喘頁儖孀夕嶄競泣侭壓峯議功潤泣壓方怏father 嶄議會催。俶傍苧議頁?壓殻會嶄繍競泣議方象窃侏協吶撹屁侏?遇壓糞縞哘喘嶄?辛卆象糞縞俶勣栖譜協。
typedef int elemtype;
typedef struct {
elemtype v1;
elemtype v2;
int cost;
}EdgeType;
void Kruskal?EdgeType edges[ ]?int n?
/*喘Kruskal 圭隈更夛嗤n 倖競泣議夕edges 議恷弌伏撹峯*/
{ int father[MAXEDGE];
int i,j,vf1,vf2;
for (i=0;i<n;i++) father[i]=-1;
i=0;j=0;
while(i<MAXEDGE && j<n-1)
{ vf1=Find(father,edges[i].v1);
vf2=Find(father,edges[i].v2);
if (vf1!=vf2)
{ father[vf2]=vf1;
j++;
printf(“%3d%3d\n”,edges[i].v1,edges[i].v2);
}
i++;
}
}
麻隈8.15
int Find?int father[ ]?int v?
/*儖孀競泣v 侭壓峯議功潤泣*/
{ int t;
t=v;
while(father[t]>=0)
t=father[t];
return(t);
}
麻隈8.16
壓Kruskal 麻隈嶄?及屈倖while 儉桟頁唹峒扮寂丼楕議麼勣荷恬?凪儉桟肝方恷謹葎MAXEDGE 肝方?凪坪何距喘議Find 痕方議坪何儉桟肝方恷謹葎n?侭參Kruskal 麻隈議扮寂鹸墫業葎O?n·MAXEDGE?。