Cod sursa(job #2282299)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 13 noiembrie 2018 16:37:04
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

const int MAX_N = 200000 + 16;
const int MAX_M = 400000 + 16;

int N, M;
struct edge
{
    int a, b, c;
} Edges[MAX_M];
pair < int, int > sol[MAX_N];
int K;

int Father[MAX_N], Rank[MAX_N];

bool cmp(edge X, edge Y)
{
    if(X.c == Y.c) return X.a < Y.a;
    return X.c < Y.c;
}

int forest_find(int);
void forest_unite(int, int);

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= M; ++i)
    {
        fin >> Edges[i].a >> Edges[i].b >> Edges[i].c;
        if(Edges[i].a > Edges[i].b)
            swap(Edges[i].a, Edges[i].b);
    }

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

    for(int i = 1; i <= N; ++i)
    {
        Father[i] = i;
        Rank[i] = 1;
    }

    int cost_arb = 0;
    int i = 1;
    while(K < N - 1 && i <= M)
    {
        int x = forest_find(Edges[i].a);
        int y = forest_find(Edges[i].b);

        if(x != y)
        {
            forest_unite(x, y);
            sol[++K] = make_pair(Edges[i].a, Edges[i].b);
            cost_arb += Edges[i].c;
        }

        i++;
    }

    fout << cost_arb << '\n';
    for(int i = 1; i <= K; ++i)
        fout << sol[i].first << ' ' << sol[i].second << '\n';

    return 0;
}

void forest_unite(int x, int y)
{
    if(Rank[x] <= Rank[y])
        Father[x] = y;
    else
        Father[y] = x;

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

int forest_find(int x)
{
    int R;
    for(R = x; R != Father[R]; R = Father[R]);

    Father[x] = R;

    while(x != R)
    {
        int next = Father[x];
        Father[x] = R;
        x = next;
    }

    return R;
}