Pagini recente » Istoria paginii runda/sim-oji-cls10-24.01 | Cod sursa (job #921382) | Cod sursa (job #385866) | Cod sursa (job #1282780) | Cod sursa (job #1601702)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define nmax 100001
using namespace std;
struct muchie
{
int x,y,c;
}aux;
vector<muchie> V;
vector<int> niv, T; //se folosesc pentru simularea arborelui
int n,m;
void citire();
int comp(muchie i, muchie j);
int root(int x);
void unificare(int rArbx, int rArby);
void Kruskal();
int main()
{
freopen("apm.in","rt",stdin);
freopen("apm.out","wt",stdout);
citire();
sort(&V[0], &V[m] ,comp); //ordonarea crescatoare a elementelor din V in functie de cost
Kruskal();
return 0;
}
void citire()
{
int c, x, y;
cin>>n>>m;
for(int i=0; i<m; ++i){
V.push_back(aux);
scanf("%d %d %d", &V[i].x, &V[i].y, &V[i].c);
}
}
int comp(muchie i,muchie j){
return (i.c<j.c);
}
int root(int x)
{
while(x != T[x])
x=T[x];
return x;
}
void unificare(int rArbx, int rArby)
{
if(niv[rArbx] > niv[rArby])
T[rArby] = rArbx;
else if(niv[rArbx] <= niv[rArby])
T[rArbx] = rArby;
if(niv[rArbx] == niv[rArby])
niv[rArby]++;
}
void Kruskal()
{
int muchie,j,cTotal=0,nrM=0, rootx, rooty; //numarul muchiilor selectate e 0
vector<pair<int, int> >S; //vectorul in care retinem muchiile arborelui solutie
for(int i=0; i<=n; ++i) //initial fiecare nod face parte dintr-un arbore separat
T.push_back(i);
niv.assign(n+1, 1); //initial toate nodurile sunt pe primul nivel
muchie=0; //plecam de la V[0]
while(nrM<n-1)
{
rootx = root(V[muchie].x);
rooty = root(V[muchie].y);
if( rootx != rooty) //daca nu se formeaza ciclu
{
unificare(rootx, rooty); //unificarea arborilor
nrM++; //creste numarul de muchii selectate
S.push_back(make_pair(V[muchie].x, V[muchie].y));
cTotal += V[muchie].c;
}
muchie++;
}
//afisare
cout<<cTotal<<'\n';
cout<<nrM<<'\n';
for(int i=0; i<nrM; ++i)
cout<<S[i].first<<' '<<S[i].second<<'\n';
}