Cod sursa(job #2401699)

Utilizator Marius92roMarius Marius92ro Data 9 aprilie 2019 22:27:07
Problema Arbore partial de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.64 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){

    //cout << 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(){

    int index = 0;

    costArborePartial = 0 , nrMuchiiArborePartial = 0;

    int lim = muchii.size();

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

            //cout << muchii[i].muchieX << " " << muchii[i].muchieY << "\n";

            dfs(muchii[i].muchieX);

           // cout <<endl;
           // cout <<endl;

            if (!vizitatNoduri[muchii[i].muchieY]){ //inseamna ca au facut parte din componente conexe diferite
                        vizitatMuchii[i] = true;
                        costArborePartial = costArborePartial + muchii[i].costMuchie;
                        nrMuchiiArborePartial++;
           // cout <<"test\n";
                        //reunim subarborii
                        reprezentareGraf[muchii[i].muchieX].push_back(muchii[i].muchieY); //graf neorientat
                        reprezentareGraf[muchii[i].muchieY].push_back(muchii[i].muchieX); //graf neorientat

            }


            for ( int i = 1; i <= nrNoduri; i++)
                        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;

        //reprezentareGraf[P.muchieX].push_back(P.muchieY); //graf neorientat
        //reprezentareGraf[P.muchieY].push_back(P.muchieX);

        muchii.push_back(P);

        vizitatMuchii[i] = false;

     }

     sort(muchii.begin(),muchii.end(),cmp);

     kruskal();
/*
    for ( int i = 1; i <= nrNoduri; i++){

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

        cout << i << ": ";

        for ( int j = 0; j < lim; j++)
            cout << reprezentareGraf[i][j] << " ";

        cout <<endl;

     }
*/
     fout << costArborePartial << "\n" << nrMuchiiArborePartial << "\n";

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


     // for (int i = 0; i < muchii.size(); i++)
           // cout << muchii[i].muchieX << " " << muchii[i].muchieY << " " <<  muchii[i].costMuchie << " \n";


    return 0;

}