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