Pagini recente » Cod sursa (job #2916792) | Cod sursa (job #2601694) | Cod sursa (job #1210608) | Cod sursa (job #335365) | Cod sursa (job #2723106)
#include <bits/stdc++.h>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
const int lim=2e5+4;
int link[lim];
int dim[lim];
int tata(int x)
{
int cpy=x,aux;
while(x!=link[x]) x=link[x];
while(cpy!=link[cpy]) aux=cpy,cpy=link[cpy],link[aux]=x;
return x;
}
void unite(int x,int y)
{
x=tata(x);
y=tata(y);
if(dim[x]<dim[y]) swap(x,y);
dim[x]+=dim[y];
link[y]=x;
}
struct Op
{
int cost;
int x;
int y;
};
vector<Op> edges;
bool mycmp(Op a,Op b)
{
return a.cost<b.cost;
}
vector<pair<int,int> > ans;
int main()
{
int n,m,a,b,c;
in>>n>>m;
for(int i=1;i<=m;++i)
{
in>>a>>b>>c;
edges.push_back({c,a,b});
}
sort(edges.begin(),edges.end(),mycmp);
for(int i=1;i<=n;++i)
{
link[i]=i;
dim[i]=1;
}
int suma=0;
for(Op p:edges)
if(tata(p.x)!=tata(p.y))
{
suma+=p.cost;
unite(p.x,p.y);
ans.push_back({p.x,p.y});
}
out<<suma<<'\n';
out<<ans.size()<<'\n';
for(auto p:ans)
out<<p.first<<' '<<p.second<<'\n';
return 0;
}