Cod sursa(job #2401718)

Utilizator Marius92roMarius Marius92ro Data 9 aprilie 2019 22:57:17
Problema Arbore partial de cost minim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.77 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <algorithm>

using namespace std;

typedef struct PAIR{

    int muchieX, muchieY, costMuchie;

}PAIR;

PAIR P;

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

int nrNoduri, nrMuchii, costArborePartial, nrMuchiiArborePartial, *vectorTati;
vector <PAIR> muchii;
bool *vizitatMuchii;

int cmp(PAIR X, PAIR Y){

    return  X.costMuchie < Y.costMuchie;

}

void kruskal(){ //initial toate nodurile sunt izolate, deci apm - ul este creat pe parcurs prin reunirea subarborilor

    int nrComponenteConexe = nrNoduri; //nrComponenteConexe reprezinta nr nodurilor grafului

    for ( int i = 1; i <= nrNoduri; i++)  // ( se pleaca de la ideea de arbore izolat , deci toate nodurile vor fi izolate )
                    vectorTati[i] = i;

    costArborePartial = 0 , nrMuchiiArborePartial = 0;

    int lim = muchii.size();

    for(int i = 0; i < lim && nrComponenteConexe > 1 ; i++){ //mergem pe fiecare muchie ( cat timp mai avem muchii si nu am parcurs toate nodurile )

		if ( vectorTati[muchii[i].muchieX] != vectorTati[muchii[i].muchieY] ){ //daca radacinile difera inseamna ca avem componente conexe diferite

			vizitatMuchii[i] = true;

			costArborePartial += muchii[i].costMuchie;
			nrMuchiiArborePartial++;

			int radacinaX = vectorTati[muchii[i].muchieX], radacinaY = vectorTati[muchii[i].muchieY];

			for (int j = 1; j <= nrNoduri; j++ ) //unim sub-arborii
                        if( vectorTati[j] == radacinaY )
                                  vectorTati[j] = radacinaX;

            nrComponenteConexe--; //scadem nr componentelor conexe ( efectiv am unit 2 noduri, deci vom scadea nr de componente conexe )
		}

    }

}

int main(){

    if ( !fin ){
        cout << "\nEroare la deschiderea fisierului !\n";
        exit(-1);
    }

    fin >> nrNoduri;

    vectorTati = NULL;

    vectorTati = new int[nrNoduri + 5];

    if (!vectorTati){
        cout << "\nEroare la alocarea dinamica !\n";
        exit(-1);
    }

     fin >> nrMuchii;

     vizitatMuchii = new bool[nrMuchii + 5];

     if (!vizitatMuchii){
         cout << "\nEroare la alocarea dinamica !\n";
         exit(-1);
     }

     for (int i = 0; i < nrMuchii; i++) {

        fin >> P.muchieX >> P.muchieY >> P.costMuchie;

        muchii.push_back(P);

        vizitatMuchii[i] = false;

     }

     sort(muchii.begin(),muchii.end(),cmp); //sortez muchiile in ordine descrescatoare dupa cost

     kruskal();

     fout << costArborePartial << "\n" << nrMuchiiArborePartial << "\n";

     for ( int i = 0; i < nrMuchii; i++)
           if ( vizitatMuchii[i] )
                    fout << muchii[i].muchieX << " " << muchii[i].muchieY << endl;


    return 0;

}