Pagini recente » Cod sursa (job #556738) | Cod sursa (job #158948) | Cod sursa (job #2677057) | Cod sursa (job #325702) | Cod sursa (job #2354665)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <typeinfo>
using namespace std;
int parinte[400005];
ifstream f("apm.in");
ofstream g("apm.out");
vector < pair < int , pair < int , int > > > Edges;
vector < pair < int , int > > rez;
int Find(int x)
{
if (parinte[x] == x)
return x;
return Find(parinte[x]);
}
void Unite(int x, int y)
{
int fx = Find(x);
int fy = Find(y);
parinte[fx] = fy;
}
int main()
{
int N, M , x, y, w;
f >> N >> M;
for ( int i = 1 ; i <= N ; ++i)
parinte[i] = i;
for ( int i = 1 ; i <= M ; ++i)
{
f >> x >> y >> w;
w += 1001;
Edges.push_back( make_pair( w, make_pair(x,y)) );
}
sort ( Edges.begin(),Edges.end() );
int weight = 0 , edges = 0, nr = 0;
//int i = 0;
while (weight < N-1 || nr < M)
{
int a = Edges[nr].second.first;
int b = Edges[nr].second.second;
int w = Edges[nr].first;
// cout << nr << " " << weight;
//cin.get();
if ( Find(a) != Find(b) )
{
Unite(a,b);
weight += w;
edges ++;
//cout << b << " " << a << " " << w << endl;
rez.push_back(make_pair(b,a));
}
nr++;
}
g << weight - (edges*1001) << endl << edges << endl;
for ( unsigned int i = 0 ; i < rez.size() ; ++i)
g << rez[i].first << " " << rez[i].second << endl;
return 0;
}