Pagini recente » Cod sursa (job #794583) | Cod sursa (job #1119562) | Cod sursa (job #2061492) | Cod sursa (job #828180) | Cod sursa (job #3211761)
#include <vector>
#include <queue>
#include <fstream>
#include <algorithm>
#include <sstream>
using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");
#define INF (1000001)
template<typename T> string tos(T x){
ostringstream os;
os<<x;
return os.str();
}
int n,m;
struct muchie{
int x,y,c;
muchie(int x_,int y_,int c_):x(x_),y(y_),c(c_){}
bool operator < (const muchie&other)const{
return c<other.c;
}
string tostring(){
string s;
s=tos(x)+ ' '+ tos(y)+ '\n';
return s;
}
};
struct padure{
int n;
vector<int>r,h;
padure(int n_):n(n_){
r.resize(n+1);
h.resize(n+1);
for(int i=1;i<=n;i++){
r[i]=i;
}
}
int rad(int x){
if(r[x]==x){
return x;
}
else{
int g=rad(r[x]);
r[x]=g;
return g;
}
}
void uniune(int x,int y){
int rx=rad(x);
int ry=rad(y);
if(rx==ry)return;
if(h[rx]>h[ry]){
r[ry]=rx;
}
else{
r[rx]=ry;
if(h[rx]==h[ry]){
ry++;
}
}
}
};
vector<muchie>vm;
void kruskal(){
padure p(n);
int k=n-1,i=0,ct=0;
vector<muchie>apm;
while(k){
while(p.rad(vm[i].x)==p.rad(vm[i].y))
i++;
k--;
ct+=vm[i].c;
apm.push_back(vm[i]);
p.uniune(vm[i].x,vm[i].y);
}
cout<<ct<<'\n'<<n-1<<'\n';
for(int i=0;i<n-1;i++){
cout<<apm[i].tostring();
}
}
int main()
{
cin>>n>>m;
int x,y,z;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
vm.push_back(muchie(x,y,z));
}
sort(vm.begin(),vm.end());
kruskal();
return 0;
}