Cod sursa(job #2470175)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 8 octombrie 2019 20:15:52
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

ifstream f("apm.in");
ofstream g("apm.out");

typedef pair < int, pair < int, int > > PIII;

const int NMAX = 2e5 + 5, MMAX = 4e5 + 5;

int N, M, X, Y, C, T[NMAX], ans;

PIII Edges[MMAX];

vector < pair < int, int > > Sol;

static inline int Find (int Node)
{
    if(Node == T[Node])
        return Node;

    T[Node] = Find(T[Node]);

    return T[Node];
}

static inline bool Unify (int X, int Y)
{
    int XX = Find(X);
    int YY = Find(Y);

    if(XX == YY)
        return false;

    T[XX] = YY;

    return true;
}

static inline void Read ()
{
    f.tie(NULL);

    f >> N >> M;

    for(int i = 1; i <= M; ++i)
        f >> Edges[i].second.first >> Edges[i].second.second >> Edges[i].first;

    return;
}

int main()
{
    Read();

    for(int i = 1; i <= N; ++i)
        T[i] = i;

    sort(Edges + 1, Edges + M + 1);

    for(int i = 1; i <= M; ++i)
        if(Unify(Edges[i].second.first, Edges[i].second.second))
        {
            ans += Edges[i].first;

            Sol.push_back(Edges[i].second);
        }

    g << ans << '\n';

    g << (int)Sol.size() << '\n';

    for(auto it : Sol)
        g << it.first << ' ' << it.second << '\n';

    return 0;
}