Cod sursa(job #1921322)

Utilizator danib99Buhaianu Daniel danib99 Data 10 martie 2017 12:11:56
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <queue>
#include <vector>
#include <functional>

#define NMAX 200001
#define MMAX 400001

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

struct muchie
{
    int x,y,c;
    friend bool operator > (muchie a, muchie b);
};

bool operator > (muchie a, muchie b)
{
    return a.c > b.c;
}

int n,m;
int h[NMAX],tata[NMAX];
muchie v[MMAX],aux;

void citire();
void Union(int x, int y);
int Find(int x);

int main()
{
    int cx,cy,cmin=0,nrsel;
    citire();
    priority_queue<muchie, vector<muchie>, greater<muchie> >H(v,v+m);
    for(nrsel=0;nrsel<n-1;)
    {
        aux=H.top();
        H.pop();
        cx=Find(aux.x);
        cy=Find(aux.y);
        if(cx!=cy)
        {
            v[nrsel++]=aux;
            Union(cx,cy);
        }
    }
    for(int i=0;i<n-1;i++)cmin+=v[i].c;
    fout<<cmin<<'\n';
    fout<<n-1<<'\n';
    for(int i=0;i<n-1;i++)fout<<v[i].x<<' '<<v[i].y<<'\n';
    return 0;
}
void citire()
{
    fin>>n>>m;
    for(int i=0;i<m;i++)
        fin>>v[i].x>>v[i].y>>v[i].c;
}
void Union(int x, int y)
{
    if(h[x]<h[y])
        tata[x]=y;
    else
        if(h[x]>h[y])
        tata[y]=x;
    else
    {
        tata[y]=x;h[x]++;
    }

}
int Find(int x)
{
    int rad,aux;
    rad=x;
    while(tata[rad])
        rad=tata[rad];
    if(x!=rad)
        while(tata[x]!=rad)
    {
        aux=tata[x];
        tata[x]=rad;
        x=aux;
    }
    return rad;
}