Pagini recente » Cod sursa (job #2364405) | Cod sursa (job #1679939) | Cod sursa (job #885126) | Cod sursa (job #2148128) | Cod sursa (job #1005745)
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
#define NMAX 200000+5
#define MMAX 400000+5
#define make(a,b,c) make_pair(make_pair(a,b),c)
#define muchie pair<pair<int,int>,int>
using namespace std;
int N,M,Total,Nr;
int root[NMAX],rang[NMAX];
bool Marcaj[MMAX];
vector<muchie> E;
int crit(muchie A,muchie B){return A.second<=B.second;}
int find(int x)
{
if(root[x]!=x) root[x]=find(root[x]);
return root[x];
}
void unite(int x,int y)
{
if(rang[x]<rang[y]) {root[x]=y; return;}
if(rang[x]>rang[y]) {root[y]=x; return;}
root[x]=y; rang[y]++;
}
int main()
{
int i,x,y,a,b,c;
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++) root[i]=i,rang[i]=1;
for(i=1;i<=M;i++)
{
scanf("%d%d%d",&a,&b,&c);
E.push_back(make(a,b,c));
}
sort(E.begin(),E.end(),crit);
for(i=0;i<M;i++)
{
x=find(E[i].first.first);
y=find(E[i].first.second);
if(x==y) continue;
unite(x,y);
Total+=E[i].second;
Marcaj[i]=1;
Nr++;
}
printf("%d\n%d\n",Total,Nr);
for(i=0;i<M;i++)
{
if(!Marcaj[i]) continue;
printf("%d %d\n",E[i].first.first,E[i].first.second);
}
return 0;
}