Pagini recente » Cod sursa (job #1618336) | Cod sursa (job #2034024) | Cod sursa (job #1012443) | Cod sursa (job #675725) | Cod sursa (job #1997881)
#include<cstdio>
#include<algorithm>
#define MAX_N 200000
#define MAX_M 400000
using namespace std;
struct edge
{
int x, y, c;
};
edge v[MAX_M];
struct Vector
{
int x, y;
};
Vector s[MAX_M];
int p[MAX_N + 1], h[MAX_N + 1], n, m, k, cost;
inline int cmp(edge x, edge y)
{
return x.c < y.c;
}
void Init(int n)
{
for(int i=1; i<=n; i++)
{
p[i] = i;
h[i] = 1;
}
}
inline int Find(int x)
{
int y, temp;
y = x;
while(p[y] != y)
y = p[y];
while(p[x] != y)
{
temp = p[x];
p[x] = y;
x = temp;
}
return y;
}
int main()
{
int i, rx, ry;
FILE *fin, *fout;
fin = fopen("apm.in","r");
fout = fopen("apm.out","w");
fscanf(fin,"%d%d",&n,&m);
for(i=0; i<m; i++)
fscanf(fin,"%d%d%d",&v[i].x,&v[i].y,&v[i].c);
Init(n);
sort(v,v+m,cmp);
for(i=0; i<m; i++)
{
rx = Find(v[i].x);
ry = Find(v[i].y);
if(rx != ry)
{
if(h[rx] > h[ry])
p[ry] = rx;
else if(h[rx] < h[ry])
p[rx] = ry;
else
{
p[rx] = ry;
h[ry]++;
}
cost += v[i].c;
s[k].x = v[i].x;
s[k++].y = v[i].y;
}
}
fprintf(fout,"%d\n%d\n",cost,k);
for(i=0; i<k; i++)
fprintf(fout,"%d %d\n",s[i].x,s[i].y);
fclose(fin);
fclose(fout);
return 0;
}