最小生成樹總結

2022-07-11 19:15:12 字數 1221 閱讀 7522

最小生成樹:prim用於處理稠密圖,因為他是以點為起點開始擴散,kruskal用於處理稀疏圖,因為他以邊為基準

prim演算法解決最小生成樹問題,思路和dijkstra很像

聯絡:dijkstra演算法是更新到起始點的距離,prim是更新到生成樹集合的距離

#include #include using namespace std;

const int n = 510, inf = 0x3f3f3f3f;

int g[n][n], dis[n]; //dis最小樹集合到這個點的最短距離,而dijkstra中表示到起點的最短距離

bool st[n]; // 是否在最小生成樹集合中

int n, m;

int prim()

// 特判,如果到不來t號點

if(i && dis[t] == inf) return inf;

if(i) res += dis[t];

st[t] = true;

for(int j = 1; j <= n; ++j)

}return res;

}int main()

int ans = prim();

if(ans == 0x3f3f3f3f) puts("impossible");

else printf("%d", ans);

return 0;

}

kruskal演算法

思路:用結構體陣列來儲存每一條邊,將邊以權重來排序,從小到**取如果會形成環則不選取

#include #include using namespace std;

const int n = 300000;

struct edge

}edges[n];

int n, m, p[100100];

// 並查集**

int find(int x)

int kruskal()

}if(cnt < n - 1) return 0x3f3f3f3f;

return res;

}int main();

}int ans = kruskal();

if(ans == 0x3f3f3f3f) puts("impossible");

else printf("%d\n", ans);

return 0;

}

最小生成樹總結

給定一張圖,圖中有許多的節點還有許多長度不同的邊將這些點點相互連線,找出連線所有點的最短方式就是最小生成樹,可以證明,這樣一種最小的情況是不會出現環的,由於所有的無環圖都可以看做樹,所以成為最小生成樹。頂層思想是分治,選擇策略是貪心,實現方法如下 以邊為中心,先將所有的邊從小到大進行排序,之後依照大...

最小生成樹總結

啊,先紀念一下吧,難得一天這麼 666 ac 完了所有題 次小生成樹 看懂 今天學到了最小生成樹演算法中的 prim 演算法和kruskal 演算法。從巨集觀上來講 prim 更適合稠密圖,krustal 更適合稀疏圖,但對於我們來說暫時沒有什麼區別啦。prim 演算法中主要注意的點是 在visit...

最小生成樹總結

研究了一天最小生成樹 衍生出來包括最小瓶頸樹,次小生成樹,最小樹形圖之類的演算法,前兩者基本能搞定,最後那個就。不太懂了日後再回去看吧似乎很少用到,抄個模板以備不時之需 先談談最小瓶頸樹 首先注意這兩個定理 命題 無向圖的最小生成樹一定是瓶頸生成樹。命題 瓶頸生成樹不一定是最小生成樹 好了 知道這個...