Pagini recente » Cod sursa (job #2321535) | Cod sursa (job #2695360) | Cod sursa (job #2274918) | Cod sursa (job #1764993) | Cod sursa (job #2401699)
#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;
}