Pagini recente » Cod sursa (job #488221) | Cod sursa (job #694854) | Cod sursa (job #1064348) | Cod sursa (job #2540728) | Cod sursa (job #2323115)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
#define NMax 200010
#define MMax 400010
struct latura{
int x, y;
int c;
bool operator()(latura & ob1, latura & ob2){
return ob1.c < ob2.c;
}
};
int n, m,tata[NMax];
latura G[MMax];
vector<int> apm;
int cost;
int Find(int);
void Union(int, int);
void init();
void rezolvare();
void afisare();
int main(){
init();
rezolvare();
afisare();
}
void init(){
fin >> n >> m;
for(int i = 0; i < m; i++)
fin >> G[i].x >> G[i].y >> G[i].c;
apm.reserve(m);
}
void rezolvare(){
int i;
sort(G, G + m, latura());
for(i = 0; i < m; i++)
if(Find(G[i].x) != Find(G[i].y)){
Union(Find(G[i].x), Find(G[i].y));
apm.push_back(i);
cost += G[i].c;
}
}
void afisare(){
int i;
fout << cost << '\n' << n - 1 << '\n';
for(i = 0; i < n - 1; i++) fout << G[apm[i]].x << ' ' << G[apm[i]].y << '\n';
}
int Find(int x){
int y, r = x;
while(tata[r]) r = tata[r];
while(tata[x]){
y = x;
x = tata[x];
tata[y] = r;
}
return r;
}
void Union(int x, int y){
tata[x] = y;
}