Pagini recente » Cod sursa (job #367901) | Cod sursa (job #2381208) | Cod sursa (job #867169) | Cod sursa (job #1574061) | Cod sursa (job #2588252)
#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;
}