Pagini recente » Cod sursa (job #1240003) | Cod sursa (job #556770) | Cod sursa (job #858577) | Cod sursa (job #1825818) | Cod sursa (job #2806742)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream gout("apm.out");
class Graf
{
private:
int noduri;
vector< pair< pair <int, int>, int> > lista_muchii;
vector< int > reprez;
vector< int > dim;
vector< pair<int, int> > rez;
int muchii = 0;
public:
Graf ();
Graf (int noduri);
void citire_graf(int m);
void APM();
void unite(int x, int y);
int Find(int x);
};
Graf :: Graf ()
{
vector< pair< pair <int, int>, int> > aux;
noduri = 0;
lista_muchii = aux;
}
Graf :: Graf (int n)
{
noduri = n;
}
void Graf :: citire_graf (int muchii)
{
int x,y,c;
for ( int i = 1; i <= muchii; i++ )
{
fin >> x >> y >>c;
lista_muchii.push_back(make_pair(make_pair(x,y),c));
}
}
int Graf :: Find(int x) {
if(x == reprez[x])
return x;
return Find(reprez[x]);
}
bool SorteazaDupaCost(const pair< pair<int,int>, int> &a,
const pair< pair<int,int>, int> &b)
{
return (a.second < b.second);
}
void Graf:: unite(int nod1,int nod2)
{
int x = Graf::Find(nod1);
int y = Graf::Find(nod2);
if (dim[x] >= dim[y])
{
reprez[y] = x;
dim[x] += dim[y];
muchii++;
}
else
{
reprez[x] = y;
dim[y] += dim[x];
muchii++;
}
}
void Graf :: APM()
{ int suma_cost = 0;
muchii = 0;
reprez.resize(noduri+1);
dim.resize(noduri+1);
for(int i = 1; i <= noduri; i++)
{reprez[i] = i;
dim[i] = 1;
}
sort(lista_muchii.begin(), lista_muchii.end(),SorteazaDupaCost);
for (int i = 0; i < lista_muchii.size(); i++)
{ int x = lista_muchii[i].first.first;
int y = lista_muchii[i].first.second;
if(Find(x) != Find(y))
{
rez.push_back(make_pair(y, x));
unite(y,x);
suma_cost+= lista_muchii[i].second;
}}
gout<<suma_cost<<'\n';
gout<<muchii<<'\n';
for(int i = 0; i< muchii; i++)
gout<<rez[i].first << ' ' << rez[i].second<<'\n';
}
int main()
{
int n,m;
fin>>n>>m;
Graf g(n);
g.citire_graf(m);
g.APM();
return 0;
}