Pagini recente » Cod sursa (job #2763832) | Cod sursa (job #1395479) | Borderou de evaluare (job #3146039) | Cod sursa (job #597180) | Cod sursa (job #1483671)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int nmx = 200005;
int n,m,tata[nmx],rang[nmx],nod1,nod2,cost,suma;
vector <pair<int,pair<int,int> > > v;
vector <pair<int,int> > g;
inline int multime(int nod){
while(nod != tata[nod])
nod = tata[nod];
return nod;
}
void uneste(const int nod1, const int nod2){
if(rang[nod1] > rang[nod2])
tata[nod2] = tata[nod1];
else
tata[nod1] = tata[nod2];
if(rang[nod1] == rang[nod2])
++rang[nod2];
}
int main(){
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i){
scanf("%d %d %d", &nod1, &nod2, &cost);
v.push_back(make_pair(cost,make_pair(nod1,nod2)));
}
sort(v.begin(),v.end());
for(int i = 1; i <= n; ++i)
tata[i] = i;
for(int i = 0; i < m; ++i){
cost = v[i].first;
nod1 = v[i].second.first;
nod2 = v[i].second.second;
int tata1 = multime(nod1);
int tata2 = multime(nod2);
if(tata1 != tata2){
uneste(tata1,tata2);
g.push_back(make_pair(nod1,nod2));
suma += cost;
}
}
printf("%d\n%d\n", suma, g.size());
for(vector<pair<int,int> >::iterator it = g.begin(); it != g.end(); ++it)
printf("%d %d\n", it->first, it->second);
return 0;
}