Pagini recente » Cod sursa (job #1543458) | Cod sursa (job #502426) | Cod sursa (job #2455265) | Cod sursa (job #2690711) | Cod sursa (job #2868235)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define N 200001
#define M 400000
#define INF 1e6
using namespace std;
struct edge
{
int x,y,c;
};
int n,m,ans;
int nr[N];
edge e[M];
bool vis[M];
int p[N];
int root(int x)
{
if(p[x]==x)
{
return x;
}
p[x]=root(p[x]);
return p[x];
}
bool verif(int x, int y)
{
return root(x)!=root(y);
}
void unionk(int x, int y)
{
int rx=root(x);
int
ry=root(y);
if(nr[rx]<nr[ry])
{
p[rx]=ry;
nr[ry]+=nr[rx];
}
else
{
p[ry]=rx;
nr[rx]+=nr[ry];
}
}
void kruskall()
{
for(int i=0;i<m;i++)
{
if(verif(e[i].x,e[i].y))
{
ans+=e[i].c;
vis[i]=1;
unionk(e[i].x,e[i].y);
}
}
}
bool cmp(edge a, edge b)
{
return a.c < b.c;
}
ifstream in ("apm.in");
ofstream out ("apm.out");
int main()
{
in >> n >> m;
for(int i=1;i<=n;i++)
{
nr[i]=1;
p[i]=i;
}
for(int i=0;i<m;i++)
{
in >> e[i].x >> e[i].y >> e[i].c;
}
sort(e,e+m,cmp);
kruskall();
out << ans << "\n";
for(int i=0;i<m;i++)
{
if(vis[i])
{
out << e[i].x << " " << e[i].y << "\n";
}
}
return 0;
}