Pagini recente » Cod sursa (job #2570858) | Cod sursa (job #1552461) | Cod sursa (job #2923448) | Cod sursa (job #1607144) | Cod sursa (job #3136532)
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
pair<int,int> Perechi[400005];
int k;
int N,M,Total,Tata[200001],Rang[400005];
struct Muchie{
int x,y,cost;
}V[200001];
bool Compare(Muchie a, Muchie b)
{
return a.cost < b.cost;
}
void Read()
{
f>>N>>M;
for(int i=1;i<=M;i++)
f>>V[i].x>>V[i].y>>V[i].cost;
sort(V+1,V+M+1, Compare);
for(int i=1;i<=M;i++)
{
cout<<V[i].x<<" "<<V[i].y<<" "<<V[i].cost<<"\n";
}
for(int i=1;i<=N;i++)
{
Tata[i] = i;
Rang[i] = 1;
}
}
int Find(int Nod)
{
while(Tata[Nod]!=Nod)
Nod = Tata[Nod];
return Nod;
}
void Unire(int x, int y)
{
if(Rang[x]<Rang[y])
Tata[x] = y;
if(Rang[x] > Rang[y])
Tata[y] = x;
if(Rang[x] == Rang[y])
{
Tata[x] = y;
Rang[y]++;
}
}
void Afisare()
{
g<<Total<<"\n";
g<<N-1<<"\n";
for(int i=1;i<=k;i++)
g<<Perechi[i].first<<" "<<Perechi[i].second<<"\n";
}
void Rezolva()
{
for(int i = 1;i<=M;i++)
{
int tatal_x = Find(V[i].x);
int tatal_y = Find(V[i].y);
if(tatal_x != tatal_y)//tatii nu sunt egali, adica nu formeaza ciclu
{
Unire(tatal_x,tatal_y);
Perechi[++k].first = V[i].x;
Perechi[k].second = V[i].y;
Total +=V[i].cost;
}
}
}
int main()
{
Read();
Rezolva();
Afisare();
}