Cod sursa(job #1285107)

Utilizator BlackBird_v.1.0Stephen Berg BlackBird_v.1.0 Data 7 decembrie 2014 09:38:28
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
 //
  /*Source developed by Azkaban13*/
 //
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <conio.h>
using namespace std;
//ifstream cin("apm.in");
//ofstream cout("apm.out");

#define st second.first
#define dr second.second
#define cost first
#define pb push_back
#define mp make_pair

vector < pair <int, pair<int,int> > > V;
int n,m,a,b,c,sol(0),suma(0);
int Root[200013],X[400013],Y[400013];

inline void initialize_root()
{
 for (int i=1;i<=n;++i) Root[i]=i;
}

inline bool comp( pair <int, pair<int,int> > a, pair <int, pair<int,int> > b)
{
 return (a.cost<b.cost);
}

inline int Find_root( int nod ) 
{
 if (Root[nod]==nod) return nod;
 return Root[nod]=Find_root(Root[nod]);
}

inline int cicle( int a, int b ) 
{
 if (a==b) return 1;
 return 0;
}

inline void add_sol(int a,int b, int c)
{
 ++sol; 
 suma+=c;
 X[sol]=a;
 Y[sol]=b;   
}

inline void unite ( int a, int b)
{
 if (a!=b) Root[b]=a;
}

void kruskal()
{
 sort(V.begin(),V.end(),comp);    
 for (int i=0;i<V.size();++i)
  {
   int r1=Find_root(V[i].st);
   int r2=Find_root(V[i].dr);
   if (!cicle(r1,r2))
         {
          add_sol(V[i].st,V[i].dr,V[i].cost);
          unite(r1,r2);
         }                                         
  }     
}

inline void print_solution()
{
 cout<<suma<<"\n";
 cout<<sol<<"\n";
 for (int i=1;i<=sol;++i) cout<<Y[i]<<" "<<X[i]<<"\n";
}

int main()
{
 cin>>n>>m;
 initialize_root();
 while(m--)
  {
    cin>>a>>b>>c;
    V.pb(mp(c,mp(a,b)));             
  }
 kruskal();
 print_solution();  
 getch();
return 0;
}