Cod sursa(job #1607133)

Utilizator cristinelulCristian Virga cristinelul Data 20 februarie 2016 20:56:53
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

struct muchii
{
    int x,y,c;
}v[400001];
int n,m,tata[200001],h[200001],s,v1[400001],v2[400001],cn;
void citire()
{
    int i;
    fin>>n>>m;
    cn=n;
    for(i=1;i<=m;i++)
        fin>>v[i].x>>v[i].y>>v[i].c;
}
bool criteriu(muchii a,muchii b)
{
    if(a.c>b.c)
        return 0;
    else
        return 1;
}
int gasire(int x)
{
    while(tata[x]!=0)
        x=tata[x];
    return x;
}
void unire(int x,int y)
{
    if(h[x]>h[y])
        tata[y]=x;
    else
    {
        if(h[y]>h[x])
            tata[x]=y;
        else
        {
            tata[x]=y;
            h[x]++;
        }
    }
}
void rezolvare()
{
    int i,rx,ry;
    for(i=1;i<n;i++)
    {
        rx=gasire(v[i].x);
        ry=gasire(v[i].y);
        if(rx!=ry)
        {
            unire(rx,ry);
            s=s+v[i].c;
            v1[i]=v[i].x;
            v2[i]=v[i].y;
        }
        else
            n++;
    }
    fout<<s<<'\n'<<cn-1<<'\n';
    for(i=1;i<n;i++)
        if(v1[i]!=0)
            fout<<v1[i]<<' '<<v2[i]<<'\n';
}
int main()
{
    citire();
    sort(v+1,v+m+1,criteriu);
    rezolvare();
    fout.close();
    return 0;
}