最小生成樹的兩種演算法及模版整理

2021-06-23 07:17:21 字數 1196 閱讀 9014

圖倫的演算法是我覺得最高大上的,因為每個演算法都有乙個很叼的名字!

哈哈,陸續整理一些自己的模版,方便自己以後使用吧。

首先是prim演算法的普通版本 複雜度o(v^2)

#include #include #include using namespace std;

const int inf = 0x3f3f3f3f;

int n;

int g[105][105];

int vis[105],d[105];

int prim()

return ans;

}int main()

return 0;

}

然後是prim版本的優先佇列優化,複雜度變為o(elogv)

#include #include #include #include using namespace std;

const int inf = 0x3f3f3f3f;

const int n = 100005;

struct edge

}node[n],t1,t2;

int dis[n],vis[n],head[n],cnt;

void init()

void addedge(int u,int v,int w)

int prim()}}

return ret;

}int main()

prim演算法的結構其實跟dijkstra求最短路特別像,連優化都差不多。。

下面是kruskal演算法,乙個貪心演算法,每次加入邊權最短的邊,並且保持樹結構(用並查集)。很容易理解,也很好寫。

#include #include #include #include using namespace std;

struct edge

edge(int _u, int _v, int _w):u(_u), v(_v), w(_w) {}

}t1;

int cmp(edge a,edge b)

int kruskal(){

sort(e.begin(),e.end(),cmp);

for(int i=1;i<=n;i++)fa[i] = i;

int ret = 0;

for(int i=0;i

最小生成樹(兩種演算法)

ifndef min tree h define min tree h include include include include include data struct data struct.h include tool tool disjoint set.h 最小生成樹 假設圖中的頂點有n...

最小生成樹兩種解法

運用了貪心的演算法。是從某個頂點開始不斷新增邊的演算法。int cost max v max v 存邊權 int mincost max v 從集合x出發的邊到每個頂點的最小權值 int book max v int v intprim mincost 0 0 int res 0 while 1 i...

最小生成樹的兩種實現

kruskal演算法的實現 根據最一般的kruskal 演算法的實現原理,本人設計並實現的演算法如下 首先在此演算法中,選邊的過程中,要首先對存在邊按權值按非遞減的順序排列,以順序判斷並加入最小生成樹邊的集合。因此設計資料結構 typedef struct myedge,eptr 在此資料結構中,a...