無向グラフの最小全域木

vector<vector<pair<int,int»> の状態のグラフを入れる

最小全域木のコストが返ってくる

非連結の場合は-1が返ってくる


long long cost(vector<vector<pair<long long,long long>>>& v){
    long long n = v.size();
    long long ans = 0;
    dsu d(n);
    priority_queue<pair<long long,pair<long long,long long>>,vector<pair<long long,pair<long long,long long>>>,greater<pair<long long,pair<long long,long long>>>> q;
    rep(i,n)for(pair<long long,long long> p : v[i]){
        if(p.first > i){
            q.push({p.second,{i,p.first}});
        }
    }
    while(q.size()!=0){
        long long w = q.top().first;
        long long x = q.top().second.first;
        long long y = q.top().second.second;
        q.pop();
        if(!d.same(x,y)){
            ans += w;
            d.merge(x,y);
        }
    }
    if(d.size(0)!=n)return -1;
    return ans;
}

最小全域木の内容が欲しい場合


vector<pair<long long,long long>>  cost(vector<vector<pair<long long,long long>>>& v){
    long long n = v.size();
    vector<pair<long long,long long>> ans;
    dsu d(n);
    priority_queue<pair<long long,pair<long long,long long>>,vector<pair<long long,pair<long long,long long>>>,greater<pair<long long,pair<long long,long long>>>> q;
    rep(i,n)for(pair<long long,long long> p : v[i]){
        if(p.first > i){
            q.push({p.second,{i,p.first}});
        }
    }
    while(q.size()!=0){
        long long w = q.top().first;
        long long x = q.top().second.first;
        long long y = q.top().second.second;
        q.pop();
        if(!d.same(x,y)){
            d.merge(x,y);
            ans.push_back({x,y});
        }
    }
    if(d.size(0)!=n)return1;
    return ans;
}