最小生成樹演算法 Kruskal演算法

2021-06-07 07:24:32 字數 1639 閱讀 3352

演算法導論看到一半,覺得還是有必要繼續看,邊看邊試試,下面是最小生成樹的kruskal演算法,這個演算法原理看起來很複雜,但實現起來很簡單:開始的時候是每個頂點一棵樹,並將邊按權重公升序排列。然後從前到後按循序選邊,如果當前選擇的邊的兩個頂點分在兩棵不同的樹中,則將該邊加入到最小生成樹中,並合當前邊連線的兩棵樹,如果邊得兩個頂點在相同的樹中,則不做任何處理,需要注意的是這個演算法是針對無向連通圖的,如果是有限圖,則需要在演算法中做些處理,但演算法原理是一樣的。看**:

1、樹和圖相關類

/// /// 圖類,由節點和邊構成.

///

public class graphic

public listedges

public graphic()

public void add(node node)

}public void add(edge edge)}}

/// /// 樹類,包括節點和邊構成

///

public class tree

public listedges

public tree()

public void add(node node)

}public void add(edge edge)}}

/// /// 節點類

///

public class node

public node(string symbol)

}/// /// 邊類,包括兩個節點和權重.

///

public class edge

public node node2

public int weight

public edge(node n1, node n2, int weight)

}

2、演算法類

public class kruskalalg

//對邊進行排序

var theedgesquery = from e in g.edges

orderby e.weight

select e;

var thesortedges = theedgesquery.toarray();

//剛開始最小生成樹為空.

tree themst = new tree();

//沒有採用foreach,以保證訪問按排序進行.

for(int i=0;i/// 在森林中尋找某個節點所在的樹

///

/// 要找的節點

/// 森林

///

private tree findtreebynode(node node, listforest)}}

return null;

}/// /// 在這個演算法中,邊是可以不用合併進來的.

///

///

///

///

///

private void uniontreeinforest(tree tree1, tree tree2, edge edge, listforest)

}

這個演算法的時間複雜度:o(e*lgv).時間除了初始化外,主要用在查詢節點所在樹和合併樹上。

最小生成樹 Prim演算法和Kruskal演算法

最小生成樹 3條構造最小生成樹的準則 只能使用該網路中的邊來構造最小生成樹 只能使用恰好n 1條邊來聯結網路中的n個結點 選用的這個n 1條邊不能構成迴路。mst性質 假設n v,是乙個連通網,u是頂點集合v的乙個非空子集。若 u,v 是一條具有最小值 代價 的邊,其中u屬於u,v屬於v u 即u對...

最小生成樹 Prim演算法和Kruskal演算法

轉於 prim演算法 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹。把 找到的邊的v加入u集合。如果u集合已有n個元素,則結束,否則繼續執行 其演算法的時間複雜度為o n 2 define maxn boolflag ...

最小生成樹 Prim演算法和Kruskal演算法

prim演算法 演算法簡單描述 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 vnew 其中x為集合v中的任一節點 起始點 enew 為空 3 重複下列操作,直到vnew v a.在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v v 如...