Cod sursa(job #1607496)

Utilizator cristinelulCristian Virga cristinelul Data 21 februarie 2016 12:03:26
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <algorithm>
#define mmax 400005
#define nmax 200005

using namespace std;

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

struct el
{
    int c,x,y;
};
el v[mmax],rez[nmax];
int n,m,cost,tata[nmax],ad[nmax];
bool mod(el x,el y)
{
    if(x.c<y.c)
        return 1;
    return 0;
}
void citire()
{
    int i;
    fin>>n>>m;
    for(i=1;i<=m;i++)
        fin>>v[i].x>>v[i].y>>v[i].c;
    sort(v+1,v+m+1,mod);
}
int gasire(int x)
{
    while(tata[x]!=0)
        x=tata[x];
    return x;
}
int legat(int x,int y)
{
    x=gasire(x);
    y=gasire(y);
    if(x==y)
        return 1;
    return 0;
}
void unire(int x,int y)
{
    x=gasire(x);
    y=gasire(y);
    if(ad[x]>ad[y])
        tata[y]=x;
    else
    {
        if(ad[x]<ad[y])
            tata[x]=y;
        else
        {
            tata[x]=y;
            ad[y]++;
        }
    }
}
void rezolvare()
{
    int i,j=0;
    for(i=1;i<=m;i++)
    {
        if(legat(v[i].x,v[i].y)==0)
        {
            unire(v[i].x,v[i].y);
            rez[++j]=v[i];
            cost=cost+v[i].c;
        }
        if(j==n-1)
            break;
    }
}
void afisare()
{
    int i;
    fout<<cost<<'\n'<<n-1<<'\n';
    for(i=1;i<n;i++)
        fout<<rez[i].x<<' '<<rez[i].y<<'\n';
}
int main()
{
    citire();
    rezolvare();
    afisare();
    fout.close();
    return 0;
}