Cod sursa(job #2491963)

Utilizator FrostfireMagirescu Tudor Frostfire Data 13 noiembrie 2019 18:17:26
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#define NMAX 200000
#define MMAX 400000

using namespace std;

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

int n, m, ans, tata[NMAX+10], rang[NMAX+10];
vector <pair <int, int> >  sol;
struct Kruskal
{   int n1, n2, c;
}nod[MMAX+10];

inline bool mycmp(Kruskal a, Kruskal b)
{   return a.c < b.c;
}

int findSet(int x)
{   int r = x, y = x;
    while(tata[r] != r) r = tata[r];
    while(tata[x] != x)
        {   x = tata[x];
            tata[y] = r;
            y = x;
        }
    return r;
}

void unite(int x, int y)
{   if(rang[x] < rang[y]) tata[x] = y;
    else tata[y] = x;

    if(rang[x] == rang[y]) rang[x]++;
}

int main()
{
    f >> n >> m;
    for(int i=1; i<=m; i++)
        {   int nod1, nod2, cost;
            f >> nod1 >> nod2 >> cost;
            Kruskal a;
            a.n1 = nod1;
            a.n2 = nod2;
            a.c = cost;
            nod[i] = a;
        }
    sort(nod+1, nod+m+1, mycmp);

    for(int i=1; i<=n; i++) tata[i] = i;
    for(int i=1; i<=m; i++)
        {   int val1 = findSet(nod[i].n1), val2 = findSet(nod[i].n2);
            if(val1 != val2)
                {   sol.push_back(make_pair(nod[i].n1, nod[i].n2));
                    ans += nod[i].c;
                    unite(val1, val2);
                }
        }
    g << ans << '\n' << sol.size() << '\n';
    for(int i=0; i<sol.size(); i++) g << sol[i].first << ' ' << sol[i].second << '\n';
    return 0;
}