Cod sursa(job #1837524)

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

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

void init(){int i;
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;nr=0;
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(){int i;
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";
out.close();
return 0;}