Cod sursa(job #2758481)

Utilizator OffuruAndrei Rozmarin Offuru Data 10 iunie 2021 17:09:52
Problema Arbore partial de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <set>
#include <bitset>

using namespace std;

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

const int nmax=2e5+10;

struct edge
{
    int u,v,cost;

    bool operator < (const edge &other) const
    {
        if(cost!=other.cost)
            return cost<other.cost;
        return u<other.u;
    }
};

set <edge> S;
vector<edge> mst;
int n,m,totalCost;
int trees[nmax];

void read()
{
    int u,v,cost;

    fin>>n>>m;

    for(int i=0;i<m;i++)
    {
        fin>>u>>v>>cost;

        S.insert({u,v,cost});
    }
}

void updateTrees(int u,int v)
{
    for(int i=1;i<=n;i++)
        if(trees[i]==trees[v] && i!=v)
            trees[i]=trees[u];
    trees[v]=trees[u];
}

void Kruskal()
{
    for(int i=1;i<=n;i++)
        trees[i]=i;

    int cnt=1;

    while(!S.empty() && cnt<n)
    {
        auto currentEdge=*S.begin();
        S.erase(S.begin());

        if(trees[currentEdge.u]!=trees[currentEdge.v])
        {
            cnt++;
            mst.emplace_back(currentEdge);
            totalCost+=currentEdge.cost;
            updateTrees(currentEdge.u,currentEdge.v);
        }
    }
}

void print()
{
    fout<<totalCost<<"\n"<<n-1<<"\n";
    for(auto it:mst)
        fout<<it.u<<" "<<it.v<<"\n";
}

int main()
{
    read();
    Kruskal();
    print();
    return 0;
}