Cod sursa(job #2062639)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 10 noiembrie 2017 17:45:05
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("kruskal.in");
ofstream fout("kruskal.out");
struct Edge
{
    int x,y,c;
};
const int NMax = 200000;
int Sol,N,M,TT[NMax + 5],R[NMax + 5],Idx[NMax + 5],k;
Edge E[NMax + 5];
bool Compare(Edge A, Edge B)
{
    return (A.c < B.c);
}
void Read()
{
    fin >> N >> M;
    for(int i = 1; i <= M; ++i)
        fin >> E[i].x >> E[i].y >> E[i].c;
    sort(E+1,E+M+1,Compare);
}

int Root(int x)
{
    while(TT[x] != x)
        x = TT[x];
    return x;
}

void Unite(int x, int y)
{
    if(R[x] < R[y])
        TT[x] = y;
    if(R[x] > R[y])
        TT[y] = x;
    if(R[x] == R[y])
    {
        TT[y] = x;
        R[x]++;
    }
}

void Kruskal()
{
    for(int i = 1; i <= N; ++i)
        TT[i] = i;
    for(int i = 1; i <= M; ++i)
    {
        int a = Root(E[i].x);
        int b = Root(E[i].y);
        if(a != b)
            {
                Unite(a,b);
                Sol += E[i].c;
                Idx[++k] = i;
            }
    }
}

void Print()
{
    fout << Sol << "\n" << N - 1 << "\n";
    for(int i = 1; i <=k; ++i)
        fout << E[Idx[i]].x << " " << E[Idx[i]].y << "\n";

}

int main()
{
    Read();
    Kruskal();
    Print();
    return 0;
}