1 条题解

  • 0
    @ 2026-6-15 11:44:23

    // 最小生成树 Kruskal算法 O(MlogM)
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    
    const int N=10010,M=100010;
    int n,m,tot,sum,mi,a[N],fa[N];
    pair<int,pair<int,int> >e[M]; //边集
    
    int find(int u){ //并查集的找根
      return fa[u]==u?u:fa[u]=find(fa[u]);
    }
    void kruskal(){
      sort(e+1,e+m+1); //排序
      for(int i=1; i<=n; i++) fa[i]=i;
      for(int i=1; i<=m; i++){
        int x=find(e[i].second.first),y=find(e[i].second.second);
        if(x!=y){
          fa[x]=y;
          sum+=e[i].first;
          if(++tot==n-1) break;
        }
      }
      cout<<sum+mi;
    }
    signed main(){
      cin>>n>>m; mi=1000;
      for(int i=1;i<=n;i++)cin>>a[i],mi=min(mi,a[i]);
      for(int i=1,u,v,w;i<=m;i++){
        cin>>u>>v>>w;
        e[i]={2*w+a[u]+a[v],{u,v}}; //点权并入边权
      }
      
      kruskal();
    }
    
    • 1

    D133【最小生成树】[USACO08NOV] Cheering up the Cow G

    信息

    ID
    2885
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    11
    已通过
    5
    上传者