Cod sursa(job #2668044)

Utilizator mihhTURCU MIHNEA ALEXANDRU mihh Data 4 noiembrie 2020 13:23:29
Problema Arbore partial de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include<bits/stdc++.h>
using namespace std;


ifstream fin( "apm.in");
ofstream fout( "apm.out");

typedef vector<int> vi;
// vector<vector<pair<int,int>>> g;
vector<tuple<int,int,int>> edges;
// vector<vector<int>> apm;
int n, m;
vi link(n+1,0);

int find(int x){
    while(x!=link[x])
        x=link[x];
    return x;
}

void unite(int x, int y){
    x=find(x), y=find(y);
    link[x]=y;
}

void kruscal(){
    sort(edges.begin(),edges.end());
    int cost=0;
    for(int i=1;i<=n;++i)
        link[i]=i;
    vector<pair<int,int>> ans;
    for(auto &t:edges){
        int x,y,c;
        tie(c,x,y)=t;
        if(find(x)!=find(y))
            unite(x, y), cost+=c, ans.push_back({x,y});
    }
    fout<<cost<<"\n"<<ans.size()<<"\n";
    for(auto& x:ans)
        fout<<x.second<<" "<<x.first<<"\n";
    // for(int i=1;i<=n;++i)
    //     if(link[i]!=i)
    //         fout<<i<<" "<<link[i]<<"\n";
}

int main(){
    fin>>n>>m;
    link.resize(n+1,-1);
    for(int i=m;i--;){
        int x,y,c;
        fin>>x>>y>>c;
        // g[x].push_back({c,y});
        // g[y].push_back({c,x});
        edges.push_back(make_tuple(c,x,y));
    } // cit
    kruscal();
}