Pagini recente » Cod sursa (job #2578543) | Rating Bacauanu Vlad (pedobear) | Cod sursa (job #672824) | Cod sursa (job #3179386) | Cod sursa (job #865672)
Cod sursa(job #865672)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
#define MAX_N 200000
#define MAX_M 400000
struct muchie{
long x, y, cost;
};
long n, m, padure[MAX_N];
muchie vec[MAX_M];
vector<long> final;
// verifica daca toate nodurile fac parte din acelasi arbore
bool verifica_oprire(){
for(long i=2; i<=n; i++)
if(padure[1] != padure[i])
return false;
return true;
}
//-----===========QUICK SORT =========--------//
int position(int li, int ls){
short int mod =1;
while(li < ls){
if(vec[li].cost > vec[ls].cost){
swap(vec[li], vec[ls]);
mod *=(-1);
}
if(mod == 1) li++;
else ls--;
}
return li;
}
void quick(int li, int ls){
if(li< ls){
int lm = position(li,ls);
quick(li, lm-1);
quick(lm+1, ls);
}
}
//-------QUICK_SORT------------////
int main(){
ifstream fin("apm.in");
ofstream fout("apm.out");
fin >> n >> m;
for(long i=0; i<m; i++){
long a, b, c;
fin >> a >> b >> c;
vec[i].x = a, vec[i].y = b, vec[i].cost = c;
}
quick(0,m-1); // sortez vectorul vec dupa costul muchiei
/// formez padure
for(long i=1; i<=n; i++){
padure[i] = i;
}
long cost_final = 0;
bool continua = verifica_oprire();
long index = -1;
while(!continua && index !=m-1){
index ++;
if(padure[vec[index].x]!= padure[vec[index].y]){
long radacina = padure[vec[index].y];
for(long i=1; i<=n; i++)
if(padure[i] == radacina)
padure[i] = padure[vec[index].x];
cost_final += vec[index].cost;
final.push_back(vec[index].x), final.push_back(vec[index].y);
}
continua = verifica_oprire();
}
fout << cost_final << '\n';
fout << final.size()/2 << '\n';
for(size_t i=0; i<final.size(); i+=2){
fout << final[i] << " "<<final[i+1]<<'\n';
}
return 0;
}