Cod sursa(job #1639956)

Utilizator cristinelulCristian Virga cristinelul Data 8 martie 2016 14:56:36
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <algorithm>
#define nmax 200005

using namespace std;

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

struct el
{
    int n1,n2,c;
}v[400001];
int n,m,tata[nmax],h[nmax],sol,rez1[nmax],rez2[nmax],rx,ry,cx,y;
bool criteriu(el a,el b)
{
    if(a.c>b.c)
        return 0;
    return 1;
}
void citire()
{
    int i;
    fin>>n>>m;
    for(i=1;i<=m;i++)
        fin>>v[i].n1>>v[i].n2>>v[i].c;
    sort(v+1,v+m+1,criteriu);
}
int gasire(int x)
{
    cx=x;
    while(tata[x]!=0)
        x=tata[x];
    while(tata[cx]!=0)
    {
        y=tata[cx];
        tata[cx]=x;
        cx=y;
    }
    return x;
}
void unire(int x,int y)
{
    if(h[x]>h[y])
        tata[y]=x;
    else
    {
        if(h[x]<h[y])
            tata[x]=y;
        else
        {
            h[x]++;
            tata[y]=x;
        }
    }
}
int legat(int x,int y)
{
    rx=gasire(x);
    ry=gasire(y);
    if(rx==ry)
        return 0;
    return 1;
}
void rezolvare()
{
    int i,nr=0;
    for(i=1;i<=m;i++)
    {
        if(legat(v[i].n1,v[i].n2))
        {
            unire(rx,ry);
            sol=sol+v[i].c;
            nr++;
            rez1[nr]=v[i].n1;
            rez2[nr]=v[i].n2;
            if(nr==n-1)
                break;
        }
    }
}
void afisare()
{
    int i;
    fout<<sol<<'\n'<<n-1<<'\n';
    for(i=1;i<n;i++)
        fout<<rez1[i]<<' '<<rez2[i]<<'\n';
}
int main()
{
    citire();
    rezolvare();
    afisare();
    fout.close();
    return 0;
}