Cod sursa(job #2205061)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 17 mai 2018 20:02:35
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;


struct arc{
int x,y,cost;


  bool operator<(arc a){
  if(cost<a.cost)return true;
  return false;

  }



};
istream& operator>>(istream& in,arc& a){
  in>>a.x>>a.y>>a.cost;
  return in;


  }

  ostream& operator<<(ostream& out,arc& a){
  out<<a.x<<' '<<a.y<<' '<<a.cost<<'\n';
  return out;

  }

int tata_suprem(int a,vector<int>& padure){
if(a==padure[a]){
return a;

}
padure[a]=tata_suprem(padure[a],padure);

return padure[a];

}


void reuniune(int a,int b, vector<int>& padure,vector<int>& rang){
a=tata_suprem(a,padure);
b=tata_suprem(b,padure);

if(rang[a]>rang[b]){
padure[b]=a;

}

else if(rang[b]>rang[a]){
padure[a]=b;
}

else{
padure[b]=a;
rang[a]++;


}



}


bool aceeasi_comp(int a,int b, vector<int>& padure){
if(tata_suprem(a,padure)==tata_suprem(b,padure))return true;
return false;

}


int main()
{
   ifstream in("apm.in");
   ofstream out("apm.out");
   int cost_total=0;

   int nr_noduri,nr_arce;
   in>>nr_noduri;
   vector<int> paduri;
   vector<int> rang;
   for(int i=0;i<=nr_noduri;i++){
   paduri.push_back(i);
   rang.push_back(0);
   }

   in>>nr_arce;
   vector<arc> arce;
   for(int i=0;i<nr_arce;i++){
   arc aux;
   in>>aux;
   arce.push_back(aux);

   }

   sort(arce.begin(),arce.end());



   vector<arc> apcm;

   for(int i=0;i<nr_arce;i++){
   arc aux=arce[i];
   if(!aceeasi_comp(aux.x,aux.y,paduri)){
   cost_total+=aux.cost;
   reuniune(aux.x,aux.y,paduri,rang);
   apcm.push_back(aux);


   }


   }

out<<cost_total<<'\n'<<apcm.size()<<'\n';

for(int i=0;i<apcm.size();i++){
out<<apcm[i].x<<" "<<apcm[i].y<<'\n';


}
    return 0;
}