最小生成樹
問題提出:
要在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中頂點相連線的代價最小的邊:
structu為生成樹上的頂點集,v-u為剩餘頂點集,t[j]用於儲存連線v-u中頂點j與u中頂點的權值最小的邊及權值。每次從陣列t中取出權值最小的邊加入到樹中(用權值為0為來代表頂點已加入生成樹集u)。t[max_vertex_num];
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 //假設,n為圖中頂點個數,e為圖中邊的個數。在kruskal中,while迴圈是影響時間效率的主要操作,其迴圈次數最多為e次,所以克魯斯卡爾演算法的時間複雜度為o(e)。最大邊數
# 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++; /*
掃瞄下一條邊*/}
}
演算法與資料結構 最小生成樹(最小支撐樹)
概念 設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 為一無向連通...