Pagini recente » Cod sursa (job #2594877) | Cod sursa (job #2041878) | Cod sursa (job #2460866) | Cod sursa (job #1120254) | Cod sursa (job #742831)
Cod sursa(job #742831)
#include <fstream>
#include <algorithm>
#include <stdio.h>
#define N 200000
using namespace std;
int E1[2*N], E2[2*N], EC[2*N], Ei[2*N], ES[N], NP[N+1], n, m, i, msel=0, a, b;
long long sum=0;
FILE *fpi = fopen("apm.in", "r");
ofstream fpo("apm.out");
bool compara(int a, int b){
return EC[a]<EC[b];
}
int gaseste(int i){
int rad=i, z;
while(rad!=NP[rad])
rad=NP[rad];
while(i!=NP[i]){
z=NP[i];
NP[i]=rad;
i=z;
}
return rad;
}
void uneste(int x, int y){
NP[x]=y;
}
int main(){
{//citire
fscanf(fpi, "%d %d", &n, &m);
for(i=0; i<m; i++){
fscanf(fpi, "%d %d %d", &E1[i], &E2[i], &EC[i]);
Ei[i]=i;
}
}
{//Kruskal
for(i=1; i<=n; i++)
NP[i]=i;
sort(Ei, Ei+m, compara);
for(i=0; i<m; i++){
a=gaseste(E1[Ei[i]]);
b=gaseste(E2[Ei[i]]);
if(a != b){
ES[msel++]=Ei[i];
sum+=EC[Ei[i]];
if(msel==n-1)
break;
uneste(a, b);
}
}
}
{//afisare
fpo<<sum<<endl<<msel<<endl;
for(i=0; i<msel; i++)
fpo<<E1[ES[i]]<<" "<<E2[ES[i]]<<endl;
}
return 0;
}