Cod sursa(job #2340911)

Utilizator itamaciucIoana Tamaciuc itamaciuc Data 11 februarie 2019 11:10:18
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 102
#define MMAX 5000

using namespace std;
ifstream fin ("kruskal.in");
ofstream fout ("kruskal.out");

struct muchie
{
    int x, y, c;
};

muchie G[MMAX];
int n, m, cost;
int conex[NMAX]; ///conex[i] - componenta conexa din care face parte i
int A[NMAX]; ///indicii muchiilor selectate in arbore

void citire();
void kruskal();
void sortare();
void afisare();
bool compar(muchie a, muchie b)
///returneaza 1 daca muchia a trb sa fie inaintea
{
    return a.c < b.c;
}

int main()
{
    citire();
    kruskal();
    afisare();
    return 0;
}

void citire()
{
    int i;
    fin >> n >> m;
    for (i=1; i<=m; i++)
        fin >> G[i].x >> G[i].y >> G[i].c;
}

void kruskal()
{
    int i, j, nrsel, cx, cy;
    ///ordonez muchiile crescator dupa cost
    ///sortare();
    sort(G+1, G+m+1, compar);
    for (i=1; i<=n; i++)
        conex[i]=i;
    nrsel=0;
    i=1;
    while (nrsel<n-1) ///i<=m (nu este conex)
        if (conex[G[i].x]!=conex[G[i].y]) ///nu formeaza cicluri
        {
            nrsel++;
            A[nrsel]=i;
            cost+=G[i].c;
            ///unificam componentele conexe ale extremitatilor
            cx=conex[G[i].x];
            cy=conex[G[i].y];
            for (j=1; j<=n; j++)
                if (conex[j]==cy)
                    conex[j]=cx;
        }
    i++;
}

void sortare()
{
    int schimb, i;
    muchie aux;
    do
    {
        schimb=0;
        for (i=1; i<m; i++)
            if (G[i].c>G[i+1].c)
            {
                aux=G[i];
                G[i]=G[i+1];
                G[i+1]=aux;
                schimb=1;
            }
    }
    while (schimb);

}

void afisare()
{
    int i;
    fout << cost << '\n';
    ///fout << n-1 << '\n';
    for (i=1; i<n; i++)
        fout << G[A[i]].x << " " << G[A[i]].y << '\n';
    fout.close();
}