Prim Kruscal演算法的C 實現

2022-05-08 21:48:07 字數 1714 閱讀 6215

使用貪心演算法。先將所有邊按照權值從小到大排序,每個點初始都是乙個樹(乙個節點的樹)。從前到後遍歷邊集,對於當前邊x-y來說,如果x、y已經在我們的最小生成樹里,那麼跳過該邊。

如果x、y至少有乙個不在我們的最小生成樹里,將該邊加入最小生成樹,並且將包含x的樹和包含y的樹合併為一棵樹。(使用並差集的合併操作完成)

kruscal演算法適用於稀疏圖

注:**未驗證正確性!

//

kruscal演算法 2023年3月29日 21:41:19

//----------------------------------

vector

father; //

並差集void merge(int x,int

y)int get_father(int

x)

returnx;}

//-----------------------------------

struct edge //

有權邊};

//-----------------------------------

//求帶權無向圖的mst邊權和

intkruscal()

vector

edges; //

edges:有權邊的集合

intr,s,t;

while(cin>>r>>s>>t)

sort(edges.begin(),edges.end(),(

const edge& a,const edge& b)

res+=edge.weigh;//

該邊加入mst

++edge_cnt;

merge(p1,p2);

//合併兩個點

if(edge_cnt>=points-1)

}return

res;

}

設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u-v中找到另一點b使得點b到v中任意一點的權值最小,此時將b點也加入集合v;以此類推,現在的集合v=,再從集合u-v中找到另一點c使得點c到v中任意一點的權值最小,此時將c點加入集合v,直至所有頂點全部被加入v,此時就構建出了一顆mst。因為有n個頂點,所以該mst就有n-1條邊,每一次向集合v中加入乙個點,就意味著找到一條mst的邊。

prim演算法適用於稠密圖 

注:**未驗證正確性!

下面**未使用優先佇列進行優化,時間複雜度為|v|*|v|,可以優化為|v|*log|v|+|e|*lg|v|

//

prim演算法 2023年3月29日 22:49:14

intprim()

int res=0; //

最小生成樹的邊權和

vector min_weigh(points,0

);

for(int i=1;ii)

for(int i=0;i1;++i)

}res+=min_distance;

min_weigh[which_point]=0;//

把新找到的點加入mst

//對min_weigh陣列進行更新,可能從which_point出發會有更小權的滿足要求的邊

for(int j=0;jj)}}

return

res;

}

A 演算法的C 實現

實現部分 標頭檔案 cpp view plain copy a star 演算法的基礎處理 ifndef a star base h define a star base h include windows.h typedef struct apoint apoint,papoint enum ap...

C語言的A 演算法

畢業 中需過用到路徑優化和誘導的演算法,網上看到很多資料,原理是簡單的,實現頗為不易,不過站在巨人的肩膀上還是容易的,借他人之石攻玉,再次總結一下。c語言 小刀刀的一篇a 演算法介紹,之中存在些許錯誤,經除錯後c語言的 如下 陣列中1代表起點,2代表終點,0代表可以通過,3代表障礙物 include...

四 c 中的演算法 刪除演算法

刪除演算法指的是刪除容器中滿足相應條件的元素。1.被刪除元素會按順序向前移動 2.不能應用於關聯式容器 3.關聯式容器的刪除需要使用演算法erase 4.list容器,可以使用自身成員函式remove 直接刪除容器的元素 函式原型為 forwardit remove forwardit first,...