Pagini recente » Cod sursa (job #2832433) | Cod sursa (job #1396495) | Cod sursa (job #1472845) | Cod sursa (job #1383654) | Cod sursa (job #1707148)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
struct muchie
{
int x,y,c;
};
struct muchie1
{
int x,y;
};
muchie1 b[200005];
muchie a[400005];
int t[200005], ctc[200005];
int n,m,cost,k1;
bool Cmp(muchie a, muchie b)
{
return a.c < b.c;
}
void Citire()
{
int i,x1,y1,c1;
ifstream fin("apm.in");
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x1>>y1>>c1;
a[i].x=x1;
a[i].y=y1;
a[i].c=c1;
}
fin.close();
}
void Union (int g, int h)
{
if(ctc[g]>ctc[h])
{
t[g]=h;
ctc[g]+=ctc[h];
}
else
{
t[h]=g;
ctc[h]+=ctc[g];
}
}
int Find(int p)
{
if(t[p]!=p)
t[p]=Find(t[p]);
return t[p];
}
/*void Unifica(int va1, int va2)
{
for(int i=1;i<=n;i++)
if(t[i]==va2)
t[i]=va1;
}*/
void Kruskal()
{
sort(a+1,a+m+1,Cmp);
int i,v1,v2,k;
k=n-1;
for(i=1;i<=n;i++)
{
t[i]=i;
ctc[i]=1;
}
for(i=1; k>0 && i<=m;i++)
{
v1=Find(a[i].x);
v2=Find(a[i].y);
if(t[v1]!=t[v2])
{
Union(t[v1],t[v2]);
k1++;
b[k1].x=a[i].y;
b[k1].y=a[i].x;
cost+=a[i].c;
k--;
}
}
}
int main()
{
Citire();
Kruskal();
ofstream fout("apm.out");
fout<<cost<<"\n";
fout<<n-1<<"\n";
for(int i=1;i<=k1;i++)
fout<<b[i].x<<" "<<b[i].y<<"\n";
fout.close();
return 0;
}