Pagini recente » Cod sursa (job #2028759) | Cod sursa (job #1384842) | Cod sursa (job #1435483) | Cod sursa (job #3261391) | Cod sursa (job #1110008)
#include <fstream>
#include <algorithm>
#define max_n 200000
#define max_m 400000
using namespace std;
ifstream input("apm.in");
ofstream output("apm.out");
struct costuri {
int x,y,c;
};
int n,m,i,j,xi,yi,ci,cost,total,k,nr,q;
costuri muchie[max_m];
int T[max_n],rang[max_n];
int sol[max_m][2];
int multime(int x)
{
if (T[x]!=x)
T[x] = multime(T[x]);
return T[x];
}
bool cmp(costuri a, costuri b)
{
return a.c<b.c;
}
void reuneste(int i,int j) {
i=multime(i);
j=multime(j);
if (i==j) return;
if (rang[i]<rang[j])
T[i]=j;
else
T[j]=i;
if (rang[i]==rang[j])
rang[i]++;
}
int main()
{
input >> n >> m;
for (i=1;i<=m;i++)
{
input >> xi >> yi >> ci;
muchie[i].x = xi;
muchie[i].y = yi;
muchie[i].c = ci;
}
sort(muchie+1,muchie+m+1,cmp);
for (i=1;i<=n;i++)
{
T[i] = i;
rang[i] = 0;
}
q = 0;
for (i=1;i<=m;i++)
{
j = muchie[i].x;
k = muchie[i].y;
cost = muchie[i].c;
if (multime(j)!=multime(k))
{
reuneste(j,k);
total +=cost;
q++;
sol[q][0] = k;
sol[q][1] = j;
}
}
output << total << " "<< q << endl;
for (i=1;i<=q;i++)
{
output << sol[i][0] <<" " << sol[i][1] << endl;
}
return 0;
}