Cod sursa(job #3196031)

Utilizator proflaurianPanaete Adrian proflaurian Data 22 ianuarie 2024 15:23:10
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
const int N = 200001;

vector<tuple<int,int,int>> E;/// vectorul muchiilor
int n,m,T[N],costAPM;/// T[] sirul de tati pentru DSU
vector<pair<int,int>> sol;/// sirul care va memora muchiile folosite in APM
int getRoot(int x) /// functia cunoscuta de la DSU
{
    if(T[x]==x)
        return x;
    T[x]=getRoot(T[x]);
    return T[x];
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
        T[i]=i; /// pregatesc DSU
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        f>>x>>y>>c;
        E.push_back(make_tuple(c,x,y));/// pun muchiile cu primul element din triplet costul< sa le pot sorta dupa cost
    }
    sort(E.begin(),E.end());
    int ramase=n-1;
    for(int i=0;i<m&&ramase>0;i++)
    {
        int x,y,c;
        tie(c,x,y)=E[i]; /// parcurg muchiile in ordinea crescatoare a costurilor
        int rx=getRoot(x);
        int ry=getRoot(y);
        if(rx!=ry)/// daca nu sunt pe aceeasi componenta conexa atunci muchia x-y devine muchie de APM si conecteaza arborii momentani ai lui x si y
        {
            costAPM+=c;/// adaug costul muchie la costul final
            sol.push_back(make_pair(x,y));/// adaug muchia x-y la muchiile de APM
            T[rx]=ry;/// reunesc componenta conexa a lui x cu cea a lui y;
            ramase--;/// am mai rezolvat o muchie din cele n-1 necasare initial
        }
    }
    g<<costAPM<<'\n';/// pe prima linie costul minim
    g<<n-1<<'\n';/// pe linia a doua numarul de muchii din APN:orice arbore cu n varfuri are n-1 muchii
    /// pe urmatoarele linii muchiile
    for(auto it:sol)
        g<<it.first<<' '<<it.second<<'\n';
    return 0;
}