Cod sursa(job #2572372)

Utilizator dsandru89Sandru Daniel Cornel dsandru89 Data 5 martie 2020 12:37:28
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <bits/stdc++.h>

using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int nMAX=200005;
const int mMAX=400005;

struct Muchii{
   int x;
   int y;
   int cost;
}V[mMAX];
pair<int,int> P[mMAX];
int n,m,TT[nMAX],RG[nMAX],mFinal=0,costFina=0;

int compara(Muchii a,Muchii b){
     return a.cost<b.cost;
}

void citire(){
    for(int i=1;i<=m;i++)
    fin>>V[i].x>>V[i].y>>V[i].cost;
    for(int i=1;i<=n;i++){TT[i]=i;RG[i]=1;}
    sort(V+1,V+m+1,compara);
}

void unire(int x,int y){
     if(RG[x]<RG[y])
        TT[x]=y;
     if(RG[x]>RG[y])
        TT[y]=x;
      if(RG[x]==RG[y])
        TT[x]=y;
        RG[y]++;
}
int Find(int nod){
    while(nod!=TT[nod]){
        nod=TT[nod];
    }
    return nod;
}

void kruskal(){
    for(int i=1;i<=m;i++){
            int tata_x=Find(V[i].x);
    int tata_y=Find(V[i].y);

         if(tata_x!=tata_y)
         {   cout<<V[i].x<<" "<<V[i].y<<" "<<tata_x<<" "<<tata_y<<endl;
             unire(tata_x,tata_y);
             mFinal++;
             P[mFinal].first=V[i].x;
             P[mFinal].second=V[i].y;
             costFina=V[i].cost;
         }

    }

}
void afisare(){
   fout<<costFina<<endl;
   for(int i=1;i<=mFinal;i++)
    fout<<P[i].first<<" "<<P[i].second<<endl;

}

int main()
{ fin>>n>>m;
citire();
kruskal();
afisare();

    return 0;
}