Cod sursa(job #2720391)

Utilizator doruliqueDoru MODRISAN dorulique Data 10 martie 2021 19:46:13
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#define nmx 200001
using namespace std;

set <pair<int,pair<int,int> > >muchii_ord;
vector <pair<int,int> > sol;
int n,m,t[nmx],costmin;

int main()
{
    ifstream fin("apm.in");
    ofstream fout("apm.out");
    int i,x,y,cost,alese=0,rx,ry,aux;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>cost;
        muchii_ord.insert(make_pair(cost,make_pair(x,y)));
    }
    while(alese<n-1)
    {
        cost=muchii_ord.begin()->first;
        x=muchii_ord.begin()->second.first;
        y=muchii_ord.begin()->second.second;
        muchii_ord.erase(muchii_ord.begin());
        ///vrem sa vedem daca putem folosi muchia (x,y)
        ///deci de la x urcam catre radacina, la fel shi de la y
        rx=x;while(t[rx])rx=t[rx];
        ry=y;while(t[ry])ry=t[ry];
        if(rx!=ry)
        {
            alese++;
            ///reunificăm arborașii
            t[ry]=rx;
            ///facem apoi compresia - adică orice nod de pe traseul dintre x și rx
            ///respectiv y și rx (pt. că rx e noul tată) îl legăm direct de rx
            aux=y;
            while(t[y]!=rx)
            {aux=y;y=t[y];t[aux]=rx;}
            costmin+=cost;
            sol.push_back(make_pair(x,y));
        }
    }
    fout<<costmin<<"\n"<<n-1<<"\n";
    for(auto&m:sol)
        fout<<m.first<<" "<<m.second<<"\n";
    return 0;
}