Cod sursa(job #1837519)

Utilizator AsttridMocanu Ada Astrid Asttrid Data 29 decembrie 2016 20:04:37
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
///alg kruskal
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct elem{int x,y;
float c;};
const int dim=200001;
elem v[dim];
int h[dim],i,j,n,m,nr,q[2*dim],t[dim];
float cost;

void citire(){in>>n>>m;
for(i=1;i<=m;i++)in>>v[i].x>>v[i].y>>v[i].c;
in.close();}

void init(){
for(i=1;i<=n;i++)h[i]=1;}

int gasit(int x){
while(t[x])x=t[x];
return x;
}

void unire(int x,int y){
if(h[x]>h[y])t[y]=x;
else {t[x]=y;
if(h[x]==h[y])h[y]++;}
}

void rez(){int i=1,x,y,t1,t2;
while(nr<=n-1){
    x=v[i].x;y=v[i].y;
t1=gasit(x);
t2=gasit(y);
if(t1!=t2){
    cost+=v[i].c;
    q[++nr]=i;
    unire(t1,t2);
    }++i;
}

}

bool cmp(elem a,elem b){
return a.c<b.c;
}

int main(){
citire();
sort(v+1,v+m+1,cmp);
init();
rez();
out<<cost<<"\n";
out<<n-1<<"\n";
for(i=1;i<=n-1;i++)
     out<<v[q[i]].x<<" "<<v[q[i]].y<<"\n";
return 0;}