定义:
生成树:无向图包含所有点的生成子图(即边集包含于原图),且是一棵树。
最小生成树:边权和最小的生成树。
基本性质:
如果把边权看做代价,那么最小生成树就是使全图连通的最小代价。
最小生成树同时满足整棵生成树上的最大边权最小,任意两点间的最大边权最小(这个性质由kruskal算法的执行过程即可得出)
算法:
Prim算法
适合处理稠密图,算法复杂度 O ( n 2 ) O(n^2) O(n2)
kruskal算法
适合处理稀疏图,算法复杂度 O ( m log m ) O(m\log m) O(mlogm)。
另外堆优化Prim(和堆优化dijkstra写法差不多)算法复杂度可降至 O ( m log n ) O(m\log n) O(mlogn),但无太大实际用途。
例题1:[FAIOJ1347]繁忙的都市
题意:求最大边权最小的生成树。
直接用板子就行了。。。
例题2:[NOIP2013][luogu1967][FAIOJ10132]货车运输
题意:求两点间最小边权最大的路径,所以是最大生成树。
用kruskal
算法求出最大生成树,然后问题就变成 q q q次询问树上两点间最小边权。
本题数据范围很小,暴力 D F S DFS DFS或倍增均可。复杂度 O ( q n ) O(qn) O(qn)(暴力)或