日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最小生成树板子-AcWing 859. Kruskal算法求最小生成树

發(fā)布時間:2025/4/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小生成树板子-AcWing 859. Kruskal算法求最小生成树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目分析


來源:acwing

分析:
Kruskal算法思路:

  • 將所有邊按權(quán)重從小到大排序。算法瓶頸在此O(m×logm)O(m\times logm)O(m×logm)
  • 枚舉每條邊:a和b是兩個點,組成的邊權(quán)重是c
    if a和b 不連通,將這條邊加入到集合中。
    第2步:時間復(fù)雜度O(m)
  • 其中第2步,就是并查集的簡單應(yīng)用。

    ac代碼

    #include<bits/stdc++.h> using namespace std; const int N = 2e5 + 10;int n, m; int p[N];struct Edge{int a, b, w;bool operator<(const Edge& W)const{return w < W.w;} }edges[N];int find(int x){if( p[x] != x) p[x] = find(p[x]);return p[x]; }int main(){cin >> n >> m;for(int i = 0; i < m; i ++){int a, b, w;cin >> a >> b >> w;edges[i] = {a, b, w};}sort(edges, edges + m);int res = 0, cnt = 0;for(int i = 1; i<= n; i++) p[i] = i;for(int i = 0; i < m; i++){int a = edges[i].a, b = edges[i].b, w = edges[i].w;a = find(a), b= find(b);if( a != b){p[a] =b;res += w;cnt ++; // 統(tǒng)計加了多少條邊}}if(cnt < n - 1) puts("impossible");else printf("%d\n", res);}

    題目來源

    https://www.acwing.com/problem/content/861/

    總結(jié)

    以上是生活随笔為你收集整理的最小生成树板子-AcWing 859. Kruskal算法求最小生成树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。