使用貪心演算法。先將所有邊按照權值從小到大排序,每個點初始都是乙個樹(乙個節點的樹)。從前到後遍歷邊集,對於當前邊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,...