最小生成樹就是用最少的邊讓圖連通
kruskal:
首先按照邊權進行從小到大進行排序,每次從剩餘的邊中選擇權值最小且邊的兩個頂點不在同乙個集合內的邊(就是不會產生迴路的邊),加入生成樹中,直到加入了n-1條邊。
**:
#include
#include
#include
using
namespace std;
const
int n=
105;
//n的數值和邊數有關
struct edge
e[n]
;int n,m;
int f[n]
=,sum=
0,cnt=0;
//並查集用的變數
void
quicksort
(int left,
int right)
} t=e[left]
; e[left]
=e[i]
; e[i]
=t;quicksort
(left,i-1)
;quicksort
(i+1
,right)
;return;}
bool
comp
(struct edge a,
struct edge b)
//sort中的比較函式
//並查集找祖先
intgetf
(int v)
}//並查集合並子集
intmerge1
(int v,
int u)
return0;
}int
main()
for(i=
1; i<=m; i++)if
(cnt == n-1)
break;}
printf
("%d"
,sum)
;return0;
}/*6 92 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
ans:19
*/
prim : 圖中頂點分兩類,樹頂點(已加入生成樹),非樹頂點(未加入生成樹)。首先選擇任意頂點加入生成樹,然後找出一條邊加入生成樹,這需要列舉每個樹頂點到每個非樹頂點所以的邊,然後找到最短邊加入最小生成樹,重複n-1,直到將所有的頂點都加入到生成樹中。
dis[n] 陣列用來存放生成樹到個各點的距離。
#include
#include
const
int n=
105;
intmain()
}for
(i=1
; i<=m; i++
)//dis,book陣列初始化
for(i=
1; i<=n; i++
) dis[i]
=e[1
][i]
;memset
(book,0,
sizeof
(book));
book[1]
=1; cnt++
;while
(cnt} book[j]=1
; cnt++
; sum+
=dis[j]
;for
(k=1
; k<=n; k++)}
printf
("%d"
,sum)
;return0;
}/*6 92 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
*/
最小生成樹題目 最小生成樹總結
給定一張圖,圖中有許多的節點還有許多長度不同的邊將這些點點相互連線,找出連線所有點的最短方式就是最小生成樹,可以證明,這樣一種最小的情況是不會出現環的,由於所有的無環圖都可以看做樹,所以成為最小生成樹。頂層思想是分治,選擇策略是貪心,實現方法如下 以邊為中心,先將所有的邊從小到大進行排序,之後依照大...
最小生成樹總結
啊,先紀念一下吧,難得一天這麼 666 ac 完了所有題 次小生成樹 看懂 今天學到了最小生成樹演算法中的 prim 演算法和kruskal 演算法。從巨集觀上來講 prim 更適合稠密圖,krustal 更適合稀疏圖,但對於我們來說暫時沒有什麼區別啦。prim 演算法中主要注意的點是 在visit...
最小生成樹總結
研究了一天最小生成樹 衍生出來包括最小瓶頸樹,次小生成樹,最小樹形圖之類的演算法,前兩者基本能搞定,最後那個就。不太懂了日後再回去看吧似乎很少用到,抄個模板以備不時之需 先談談最小瓶頸樹 首先注意這兩個定理 命題 無向圖的最小生成樹一定是瓶頸生成樹。命題 瓶頸生成樹不一定是最小生成樹 好了 知道這個...