Cod sursa(job #2588252)

Utilizator Marius92roMarius Marius92ro Data 24 martie 2020 16:29:29
Problema Arbore partial de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.8 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <algorithm>

using namespace std;

#define MAX 500000

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> reprezentareArborePartial[MAX];
vector <PAIR> muchii;
bool vizitatNoduri[MAX], vizitatMuchii[MAX];

int cmp(PAIR X, PAIR Y){

    return  X.costMuchie < Y.costMuchie;

}

void dfs(int nodStart){

    vizitatNoduri[nodStart] = true;

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

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

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

    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
                        reprezentareArborePartial[muchii[i].muchieX].push_back(muchii[i].muchieY); //graf neorientat
                        reprezentareArborePartial[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;

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

     fin >> nrMuchii;

     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 << "\n";


    return 0;

}