Pagini recente » Cod sursa (job #394246) | Cod sursa (job #2448550) | Cod sursa (job #2467474) | Cod sursa (job #1042867) | Cod sursa (job #881303)
Cod sursa(job #881303)
#include<fstream>
#define dmax 400003
#define nmax 200003
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
int n, m, apm[nmax], p[nmax], dpt[nmax];
struct edge
{
int a;
int b;
int c;
} edg[dmax];
int sf(edge x, edge y)
{
return x.c < y.c;
}
void merge(int a, int b)
{
while(p[a] != 0)
a = p[a];
while(p[b] != 0)
b = p[b];
if(dpt[a] < dpt[b])
p[a] = b;
else p[b] = a;
}
bool conn(int a, int b)
{
while(p[a] != 0)
a = p[a];
while(p[b] != 0)
b = p[b];
return (a==b);
}
void kruskal()
{
int nr=0, crt=1, cost=0;
for(int i=1; i<=n; i++)
dpt[i] = 1;
while(nr < n-1)
{
while(conn(edg[crt].a, edg[crt].b))
crt++;
nr++;
apm[nr] = crt;
cost += edg[crt].c;
merge(edg[crt].a, edg[crt].b);
}
out<<cost<<'\n';
}
int main()
{
in>>n>>m;
for(int i=1; i<=m; i++)
{
in>>edg[i].a>>edg[i].b>>edg[i].c;
}
in.close();
sort(edg+1, edg+m+1, sf);
kruskal();
out<<n-1<<'\n';
for(int i=1; i<n; i++)
out<<edg[apm[i]].a<<" "<<edg[apm[i]].b<<'\n';
out.close();
return 0;
}