Cod sursa(job #2401701)

Utilizator Marius92roMarius Marius92ro Data 9 aprilie 2019 22:31:52
Problema Arbore partial de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.19 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;
vector <int> *reprezentareGraf;
vector <PAIR> muchii;
bool *vizitatNoduri, *vizitatMuchii;

int cmp(PAIR X, PAIR Y){

    return  X.costMuchie < Y.costMuchie;

}

void dfs(int nodStart){

    vizitatNoduri[nodStart] = true;

    int lim = reprezentareGraf[nodStart].size();

    for ( int i = 0; i < lim; i++)
                if ( vizitatNoduri[reprezentareGraf[nodStart][i]] == false )
                                    dfs(reprezentareGraf[nodStart][i]);
}

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

    int index = 0;

    costArborePartial = 0 , nrMuchiiArborePartial = 0;

    int lim = muchii.size();

    for ( int i = 0; i < lim; i++ ){  //parcurg muchiile sortate

            dfs(muchii[i].muchieX); //verifica daca capetele apartin aceleiasi componente conexe

            if (!vizitatNoduri[muchii[i].muchieY]){ //inseamna ca au facut parte din componente conexe diferite

                        vizitatMuchii[i] = true; //marchez muchia
                        costArborePartial = costArborePartial + muchii[i].costMuchie;
                        nrMuchiiArborePartial++;

                        //reunesc subarborii
                        reprezentareGraf[muchii[i].muchieX].push_back(muchii[i].muchieY); //graf neorientat
                        reprezentareGraf[muchii[i].muchieY].push_back(muchii[i].muchieX);

            }

            for ( int i = 1; i <= nrNoduri; i++) //pregatesc noul graf pentru urmatoarea prelucrare dfs
                            vizitatNoduri[i] = false;
    }

}

int main(){

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

     fin >> nrNoduri;

     reprezentareGraf = NULL;
     vizitatNoduri = NULL;

     reprezentareGraf = new vector <int>[nrNoduri + 5];
     vizitatNoduri = new bool[nrNoduri + 5];

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

     for ( int i = 1; i <= nrNoduri; i++)
                    vizitatNoduri[i] = false;

     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;

}