5.4 最小生成樹

圖的生成樹就是携丁,在頂點集琢歇,邊集中找到一個集合,里面有n個頂點(所有頂點)梦鉴,n-1條邊李茫,這個集合能組成一棵樹。這便是生成樹肥橙,而最小生成樹是魄宏,這個樹的邊權(quán)之和是所有生成樹最小的。

實現(xiàn)最小生成樹的算法可分為兩種存筏,一種是面向頂點宠互,一種是面向邊,都是貪心算法椭坚。

1. Prim算法(普里姆算法)

面向頂點的算法予跌,基本思路是先讓一個頂點加入樹,然后不斷地把距離樹中頂點最近的且未加入樹的頂點加入樹中善茎。

//lowcost存儲著每一個頂點到當(dāng)前樹的最近距離券册,初始值為,每個頂點到樹的第一個點的最短距離
for (i = 1; i < G.numVertexes;i++)
{
    min = INFINITY;
    while(j < G.numVertexes)//找出離樹最近且不在樹中的頂點
    {
        if (lowcost[j] != 0 && lowcost[j] < min)
        {
            min = lowcost[j];
            k = j;
        }
    }

    printf("")//輸出新加入樹中的頂點k
    lowcost[k] = 0;//頂點k距離樹的最短距離設(shè)為0垂涯,表示k已在樹中

    for (j = 1; j < G.numVertexes; j++)
    {
        //遍歷所有頂點烁焙,如果他們與新加入頂點k的距離比原來lowcost要短,則刷新lowcost
        if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
        {
            lowcost[j] = G.arc[k][j];
        }
    }
}

2. Kruskal算法 (克魯斯卡爾算法)

面向邊的算法耕赘,基本思路是不斷讓最短的邊加入及其連接的點加入樹中骄蝇。但是,可能會連入邊導(dǎo)致樹出現(xiàn)環(huán)操骡,所以九火,最短邊加入之前要判斷其加入是否會使樹變成圖赚窃。

生成樹的本質(zhì)是一個樹狀的連通圖,而Kruskal算法形成生成樹的過程吃既,就是不斷添加新的邊考榨。

這個過程中,無非出現(xiàn)兩種情況

  1. 添加新邊鹦倚,樹中多添加了一個頂點
  2. 添加新邊河质,樹中多添加了一個連通圖(也就是已經(jīng)連好的一連串頂點)
    第二種情況可能存在,新添加的頂點所在的連通圖震叙,不是新的連通圖掀鹅,而是同一個連通圖中的兩個點相連形成環(huán),要想辦法判斷出這種情況媒楼。即新添加的邊的兩個頂點是否存在于同一個連通圖中乐尊。
//所有的parent都初始化為0

int Find (int *parent, int f)
{
    while (parent[f] > 0)
        f = parent[f];
    return f;
}

//邊的數(shù)組是以邊的長度排序的,所以遍歷是從最短邊開始的
for (i = 0; i< G.numEdges; i++)
{
    n = Find(parent, edges[i].begin);
    m = Find(parent, edges[i].end);

    if (n != m)
    {
        parent[n] = m;
        printf()//輸出新加入的邊
    }
}

所生成的連通圖的點都以 <1,2>,<2,3><3,4>這樣的序列記錄起來划址。
用的是parent數(shù)組扔嵌,parent[1] = 2,parent[2] = 3,parent[3] = 4的方式。

因此edges[i] 所連的兩個頂點夺颤,如果在同一個連通圖內(nèi)痢缎,必然能通過Find()最終找到在連通圖序列中排行最后的點。所以此時世澜,m == n独旷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寥裂,隨后出現(xiàn)的幾起案子嵌洼,更是在濱河造成了極大的恐慌,老刑警劉巖封恰,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麻养,死亡現(xiàn)場離奇詭異,居然都是意外死亡诺舔,警方通過查閱死者的電腦和手機鳖昌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混萝,“玉大人,你說我怎么就攤上這事萍恕∫萼郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵允粤,是天一觀的道長崭倘。 經(jīng)常有香客問我翼岁,道長,這世上最難降的妖魔是什么司光? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任琅坡,我火速辦了婚禮,結(jié)果婚禮上残家,老公的妹妹穿的比我還像新娘榆俺。我一直安慰自己,他們只是感情好坞淮,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布茴晋。 她就那樣靜靜地躺著,像睡著了一般回窘。 火紅的嫁衣襯著肌膚如雪诺擅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天啡直,我揣著相機與錄音烁涌,去河邊找鬼。 笑死酒觅,一個胖子當(dāng)著我的面吹牛撮执,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阐滩,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼二打,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掂榔?” 一聲冷哼從身側(cè)響起继效,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎装获,沒想到半個月后瑞信,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡穴豫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年凡简,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片精肃。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秤涩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出司抱,到底是詐尸還是另有隱情筐眷,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布习柠,位于F島的核電站匀谣,受9級特大地震影響照棋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜武翎,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一烈炭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宝恶,春花似錦符隙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至露久,卻和暖如春更米,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毫痕。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工征峦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人消请。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓栏笆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親臊泰。 傳聞我的和親對象是個殘疾皇子蛉加,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容