Pagini recente » Cod sursa (job #1686975) | Cod sursa (job #2960845) | Cod sursa (job #3225599) | Cod sursa (job #2857917) | Cod sursa (job #1190906)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
int N,M,CostTotal,h[200000],p[200000],nr;
struct muchie
{
int x,y,cost;
}Muchie[400000],MuchieNou[200000];
void citire(int &N, int &M)
{
f>>N>>M;
for(int i=0;i<M;i++)
f>>Muchie[i].x>>Muchie[i].y>>Muchie[i].cost;
}
bool compara(muchie a, muchie b)
{
return a.cost<b.cost;
}
void MakeSet(int u)
{
h[u]=0;
p[u]=0;
}
int FindSet(int u)
{
if (p[u]==0)
return u;
p[u]=FindSet(p[u]); //tatal lui u devine radacina
return p[u];
}
void Union(int u,int v)
{
u=FindSet(u);
v=FindSet(v);
if (h[u]>h[v])
p[v]=u;
else
{
p[u]=v;
if(h[u]==h[v])
h[v]=h[v]+1;
}
}
int main()
{
int i;
citire(N,M);
sort(Muchie,Muchie+M,compara);
for(i=0;i<M;i++)
if(FindSet(Muchie[i].x)!=FindSet(Muchie[i].y))
{
MuchieNou[nr++]=Muchie[i];
Union(Muchie[i].x,Muchie[i].y);
CostTotal+=Muchie[i].cost;
if(nr==N-1) break;
}
g<<CostTotal<<'\n'<<nr<<'\n';
for(i=0;i<nr;i++)
g<<MuchieNou[i].x<<" "<<MuchieNou[i].y<<'\n';
return 0;
}