Pagini recente » Cod sursa (job #860931) | Cod sursa (job #2378857) | Cod sursa (job #3255976) | Cod sursa (job #1344747) | Cod sursa (job #2338040)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int NMAX=200000;
const int MMAX=400000;
struct muchie
{
int u, v, cost;
bool ok;
//daca ok==1 atunci am folosit muchia la construirea arborelui
};
bool cmp(muchie a, muchie b)
{
return a.cost<b.cost;
}
vector <muchie>graf;
int t[NMAX+5], h[NMAX+5];
int FindSet(int x)
{
while(x!=t[x])
x=t[x];
return x;
}
void UnionSet(int x, int y)
{
//x si y sunt radacinile celor 2 arbori
if(h[x]==h[y])
{
h[x]++;
t[y]=x;
}
else
{
if(h[x]>h[y])
t[y]=x;
else
t[x]=y;
}
}
int main()
{
int suma=0, i, n, m, x, y, c, tu, tv, nrm=0;
muchie a;
a.ok=0;
fin>>n>>m;
for(i=1;i<=n;i++)
{
t[i]=i;
h[i]=1;
}
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
a.u=x;
a.v=y;
a.cost=c;
graf.push_back(a);
}
sort(graf.begin(), graf.end(), cmp);
for(i=0;i<m;i++)
{
tu=FindSet(graf[i].u);
tv=FindSet(graf[i].v);
if(tu!=tv)
{
UnionSet(tu, tv);
suma=suma+graf[i].cost;
nrm++;
graf[i].ok=1;
}
}
fout<<suma<<"\n";
fout<<nrm<<"\n";
for(i=0;i<m;i++)
if(graf[i].ok==1)
fout<<graf[i].u<<" "<<graf[i].v<<"\n";
return 0;
}