Cod sursa(job #1012602)

Utilizator x3medima17Dima Savva x3medima17 Data 19 octombrie 2013 13:20:36
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.54 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");

struct vector{
       int x,y,val,done;
       };

class FX{
public:
      void sort(int l, int r, vector *vectors)
       {

            int i,k;
            vector b;
            if (l>r) return;
            b = vectors[l]; k=l;
            for(i=l+1;i<=r;i++)
              if(vectors[i].val<b.val){
                                   k++;
                                   swap(vectors[k],vectors[i]);
                                   }
              vectors[l]=vectors[k];
              vectors[k]=b;
              //cout<<l<<" "<<r<<endl;
              sort(l,k-1,vectors);
              sort(k+1,r,vectors);
       }
       
      
      };

class Graf : public FX
{

public:
        int parents[200003],n,m,value,edges,sz[200003];
        vector vectors[200003];

       Graf(int n,int m)
       {
               for(int i=1;i<=n;i++) parents[i] = i;
               this->n = n;
               this->m = m;
               this->value = 0;
       }

       void Read()
       {
            for(int i=1;i<=m;i++) fin>>vectors[i].x>>vectors[i].y>>vectors[i].val;
            //heap_sort(n,vectors);
       }
       void SortVectors()
       {
            sort(1,m,vectors);
       }

       void ShowVectors()
       {    
            
            for(int i=1;i<=m;i++) cout<<vectors[i].x<<" "<<vectors[i].y<<" "<<vectors[i].val<<endl;
            cout<<endl;
       }

       void ShowParents()
       {
            for(int i=1;i<=n;i++) cout<<parents[i]<<" ";
            cout<<endl;

       }
       int root(int i){
           while(i != parents[i]) {
                   parents[i] = parents[parents[i]];
                   i= parents[i];
                   
                   }
           return i;
       }
       void Union(int i, int j)
       {
            int p = root(i);
            int q = root(j);
            if(sz[p] < sz[q]){ parents[p] =q; sz[q] += sz[p]; }
            else             { parents[q]= p; sz[p] += sz[q]; }
       }

       bool Connected(int i, int j){
            return root(i) == root(j);
            }
            
       void Apm()
       {
            //while(nodes<n)
            for(int i=1;i<=m;i++){
                    int p = vectors[i].x;
                    int q = vectors[i].y;
                    if(!Connected(p,q)){
                                         Union(p,q);
                                         value += vectors[i].val;
                                         vectors[i].done = 1;
                                         edges++;
                                        // cout<<p<<" "<<q<<" "<<vectors[i].val<<endl;
                                         //ShowParents();
                                         //cout<<value<<endl;
                                         }
                    
                    
                   // system("pause");
                    }

       }

       void ShowResult()
       {
           fout<<value<<"\n";
           fout<<edges<<"\n";
           for(int i=1;i<=m;i++)
            if(vectors[i].done == 1) fout<<vectors[i].x<<" "<<vectors[i].y<<"\n";

       }

      };

int n,i,k,j,m,ac=0,value=0;


int main(){
    fin>>n>>m;
    Graf *graf = new Graf(n,m);
    graf->Read();
    graf->SortVectors();
   // graf->ShowVectors();
    graf->Apm();
    //cout<<graf->m<<endl;
    graf->ShowResult();
//    system("pause");

}