999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

克魯斯卡爾(Kruskal)算法的實現與分析

2008-12-31 00:00:00虎治勤
電腦知識與技術 2008年11期

摘要:克魯斯卡爾(Kruskal)算法是實現圖的最小生成樹最常用的算法。本文主要介紹克魯斯卡爾(Kruskal)算法的實現方法,并對克魯斯卡爾(Kruskal)算法的效率進行分析。

關鍵詞:克魯斯卡爾(Kruskal)算法;算法實現;算法分析

中圖分類號:TP301文獻標識碼:A文章編號:1009-3044(2008)11-20311-02

1 克魯斯卡爾(Kruskal)算法的基本思想

設有一個有n個頂點的連通網絡N={V,E},最初先構造一個只有n個頂點,沒有邊的非連通圖T={V,Oslash;},圖中每個頂點自成一個連通分量。當在E中選到一條具有最小權值的邊時,若該邊的兩個頂點落在不同的連通分量上,則將此邊加入到T中;否則將此邊舍去,重新選擇一條權值最小的邊。如此重復下去,直到所有頂點在同一個連通分量上為止。

算法的基本框架:利用最小堆(MinHeap)和并查集(DisjointSets)來實現克魯斯卡爾(Kruskal)算法。

2 應用克魯斯卡爾(Kruskal)算法構造最小生成樹的實例

建立最小生成樹的實現過程:

出堆順序:(0,5,10)選中,(2,3,12)選中,(1,6,14)選中,(1,2,16)選中,(3,6,18)舍棄,(3,4,22)選中,(4,6,24)舍棄,(4,5,25)選中。

鄰接矩陣表示:

3 克魯斯卡爾(Kruskal)算法的實現

首先,利用最小堆來存放E中的所有的邊,堆中每個結點的格式為:

在構造最小生成樹的過程中,最小堆中存放剩余的邊,并且利用并查集的運算檢查依附于一條邊的兩個頂點tail、head是否在同一個連通分量(即并查集的同一個子集合)上,是則舍去這條邊;否則將此邊加入T,同時將這兩個頂點放在同一個連通分量上。隨著各邊逐步加入到最小生成樹的邊集合中,各連通分量也在逐步合并,直到形成一個連通分量為止。

最小生成樹類定義:

Cons tint MAXINT= 機器可表示的最大數

class MinSpanTree;

class MSTEdgeNode {//生成樹邊結點類定義

friend class MinSpanTree;

private:

int tail, head; //生成樹各邊的兩頂點

float cost; //生成樹各邊的代價

};

class MinSpanTree { //生成樹的類定義

public:

MinSpanTree ( int sz = NumVertices -1 ) : MaxSize (sz), n (0)

{ edgevalue = new MSTEdgeNode[MaxSize]; }

int Insert ( MSTEdgeNode item );//將item加到最小生成樹中

protected:

MSTEdgeNode *edgevalue; //邊值數組

int MaxSize, n; //最大邊數,當前邊數

};

利用克魯斯卡爾(Kruskal)算法建立最小生成樹:

void Graph ::Kruskal ( MinSpanTree T ) {

MSTEdgeNodee; //邊結點輔助單元

MinHeap H(CurrentEdges);

int NumVertices = VerticesList.last; //頂點個數

UFSets F (NumVertices); //并查集F 并初始化

for ( int u = 0; u < NumVertices; u++ ) //鄰接矩陣

for ( int v = u +1; v < NumVertices; v++ )

if ( Edge[u][v] != MAXNUM ) { //所有邊

e.tail = u;e.head = v;

e.cost = Edge[u][v];H.Insert (e);//插入堆

}

int count = 1; //最小生成樹加入邊數的計數

while ( count < NumVertices ) {

H.RemoveMin ( e ); //從堆中退出一條邊

u = F.Find ( e.tail ); //檢測兩端點的根

v = F.Find ( e.head );

if ( u != v ) {//根不同不在同一連通分量

F.Union ( u, v ); //合并

T.Insert ( e ); //該邊存入最小生成樹 T

count++;

}

}

}

4 克魯斯卡爾(Kruskal)算法分析

在建立最小堆時需要檢測鄰接矩陣,計算的時間代價為O(n2)。且做了e次堆插入操作,每次插入調用了一個堆調整算法FilterUp()算法,因此堆插入需要的時間代價為O(elog2e)。

在構造最小生成樹時,最多調用了e次出堆操作RemoveMin(),2e次并查集的Find()操作,n-1次Union()操作,計算時間分別為O(elog2e),O(elog2n)和O(n)。

總的計算時間為O(elog2e+elog2n+n2+n)。

參考文獻:

[1] (美)D E 克努特.管紀文,等,譯.計算機程序設計技巧3[M].北京:國防工業出版社,1999.185-190.

[2] 許卓群,等.數據結構[M].北京:高等教育出版社,1993.103-108.

[3] 嚴蔚敏,等.數據結構[M].北京:清華大學出版社,2004.207-215.

注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文

主站蜘蛛池模板: 国产激情无码一区二区APP | 影音先锋丝袜制服| 玖玖免费视频在线观看| 国产在线视频二区| 精品无码日韩国产不卡av| 久久人妻xunleige无码| 欧美日韩亚洲国产主播第一区| 成年人视频一区二区| 欧美精品高清| 一本大道香蕉中文日本不卡高清二区| a毛片免费在线观看| 日本精品一在线观看视频| 日本一区二区三区精品国产| 色哟哟国产精品一区二区| 五月婷婷欧美| 精品亚洲欧美中文字幕在线看| 激情成人综合网| 在线无码av一区二区三区| 亚洲aaa视频| 国产麻豆精品在线观看| 看你懂的巨臀中文字幕一区二区| 波多野结衣无码视频在线观看| 国产综合在线观看视频| 日韩午夜福利在线观看| 成人国产精品网站在线看| 色婷婷天天综合在线| 国产va在线观看免费| 综合色亚洲| 精品福利视频网| 成人中文在线| 国产va在线观看免费| 久久黄色免费电影| 色综合成人| 亚洲一区二区三区国产精品| 国产精品白浆在线播放| 国产精品久线在线观看| 全午夜免费一级毛片| 19国产精品麻豆免费观看| 国产福利影院在线观看| 中文字幕亚洲乱码熟女1区2区| 日韩av电影一区二区三区四区| 久久亚洲国产最新网站| 欧美一区二区三区国产精品| 五月婷婷欧美| 亚洲成人网在线观看| 亚洲成人精品| 欧美啪啪网| 亚洲综合片| 日韩成人午夜| 国产成人综合日韩精品无码不卡| 思思99思思久久最新精品| 国产老女人精品免费视频| 日韩无码视频播放| 精品一区二区三区四区五区| 粉嫩国产白浆在线观看| aaa国产一级毛片| 女人av社区男人的天堂| 成人免费视频一区| 国产在线高清一级毛片| 日本www在线视频| 香蕉eeww99国产在线观看| 台湾AV国片精品女同性| 麻豆精品视频在线原创| 欧美午夜性视频| 片在线无码观看| 亚洲免费毛片| 国产无码网站在线观看| 亚洲欧洲日产无码AV| 都市激情亚洲综合久久| 亚洲人成日本在线观看| 成人日韩精品| 日韩精品成人网页视频在线| 欧美色99| 性色一区| 91麻豆精品国产高清在线| 囯产av无码片毛片一级| 国产精品福利一区二区久久| 99久久国产综合精品女同| 91成人精品视频| 在线色综合| 亚洲日韩精品欧美中文字幕| 成人福利在线看|