資料結構與演算法11 最小生成樹

2022-03-07 02:05:23 字數 3236 閱讀 1954

最小生成樹

問題提出:

要在n個城市間建立通訊聯絡網,城市間的通訊線路造價不同,希望找到一種方案使得建立該通訊網所需花費的總代價最小。

問題分析:

n個城市間,最多可設定n(n-1)/2條線路; n個城市間建立通訊網,至少需n-1條線路;

問題轉化為:如何在可能的線路中選擇n-1條,能把所有城市(頂點)連起來,且總耗費(各邊權值之和最小

定義:

生成樹中邊的權值(代價)之和最小的樹。

構造最小生成樹的準則:

例項:

普里姆(prim)演算法

普里姆方法的思想:

1)在圖中任取乙個頂點k作為開始點,令u=,w=v-u,其中v為圖中所有頂點集,

2)然後找乙個頂點在u中,另乙個頂點在w中的邊中最短的一條,找到後,將該邊作為最小生成樹的樹邊儲存起來,並將該邊頂點全部加入u集合中,並從w中刪去這些頂點,然後重新調整u中頂點到w中頂點的距離, 使之保持最小,

再重複此過程,直到w為空集止。求解過程參見下頁圖。

簡單地說,此過程是不斷地在w中找出與u裡邊相連的權值最小的邊。

演算法的基本思想

設定乙個輔助陣列t,對當前v-u集中的每個頂點,記錄和頂點集u中頂點相連線的代價最小的邊:

struct

t[max_vertex_num];

u為生成樹上的頂點集,v-u為剩餘頂點集,t[j]用於儲存連線v-u中頂點j與u中頂點的權值最小的邊及權值。每次從陣列t中取出權值最小的邊加入到樹中(用權值為0為來代表頂點已加入生成樹集u)

1,初始化輔助陣列,出發點加入u

2,對其餘頂點  

2.1 求出下乙個加入樹的頂點k。  

2.2 輸出加入樹的邊,將頂點k併入u  

2.3 修改其它頂點的最小邊。

假設開始頂點就選為頂點1,故首先有u=,w=

解釋:第乙個頂點1,它連線到3的權值最小為1,所以加入生成樹中,並令t中1與3相連的邊權值為0,同時加入與頂點3相連邊的權值。不斷重複此操作,直到w完畢。

演算法實現:

void

minispantree_prim(mgraph g, vertextype u)

}t[k].lowcost = 0

;

for(i=1; i/*

g.vexnum-1次迴圈,尋找當前最小權值的邊

*/ }

printf(

"(%c, %c), %d\n

", g.v[t[k].adjvex], g.v[k], t[k].lowcost); /*

輸出生成樹的邊

*/t[k].lowcost = 0; /*

標記頂點k已加入生成樹

*/for(j=0;j/*

頂點k加入生成樹後重新選擇最小邊

*/ }}}

時間複雜度:

在普里姆演算法中,第乙個進行初始化的for迴圈語句的執行次數為n-1,第二個for迴圈中又包括了兩個for迴圈,執行次數為2(n-1)2  ,所以時間複雜度為o(n2)

克魯斯卡爾(kruskal)演算法

1. 克魯斯卡爾演算法基本思想

克魯斯卡爾演算法的基本思想是:

將圖中所有邊按權值遞增順序排列,依次選定取權值較小的邊,但要求後面選取的邊不能與前面選取的邊構成迴路,

若構成迴路,則放棄該條邊,再去選後面權值較大的邊,n個頂點的圖中,選夠n-1條邊即可。

例如,對上圖中無向網,用克魯斯卡爾演算法求最小生成樹的過程見下圖。

這一過程相當於選點加入樹中。

kruskal演算法的關鍵:如何判斷加入的邊是否形成迴路。可以採用將各頂點劃分為不同集合的方法來解決,每個集合中的頂點表示乙個無迴路的連通分量。

因此,設計乙個陣列int vset[maxv],利用vset[i]來判定各頂點是否屬於同一集合中。其初始值為vset[i]=i(i=0,1,...,maxv-1),i為頂點所在集合的編號,表示各頂點在不同的集合上。

演算法實現:

#define maxe  //

最大邊數

# define maxv

//最大頂點數

typedef

struct

edge; //

邊集型別資料結構

void kruskal(edge ge, int n, int

e) k = 0; /*

生成樹中邊的數目,初值為0

*/j = 0; /*

邊集陣列ge的下標,初值為0

*/while(k<=n-1) /*

生成樹中的邊數小於n條時繼續迴圈

*/ j++; /*

掃瞄下一條邊*/}

}

假設,n為圖中頂點個數,e為圖中邊的個數。在kruskal中,while迴圈是影響時間效率的主要操作,其迴圈次數最多為e次,所以克魯斯卡爾演算法的時間複雜度為o(e)。

演算法與資料結構 最小生成樹(最小支撐樹)

概念 設g v,e 是乙個無向連通圖,生成樹上各邊的權值之和為該生成樹的代價,在g的所有生成樹中,代價最小的生成樹就稱為最小支撐樹,或稱最小生成樹。區別 最小生成樹是各邊權值和最小的數 最優歸併樹是帶權外部路徑長度最短的樹 演算法 kruskal演算法 prim演算法 來自 1 include 2 ...

資料結構 最小生成樹

生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...

資料結構(最小生成樹)

對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...