Cod sursa(job #1708425)

Utilizator ConstantinandreiConstantin Constantinandrei Data 27 mai 2016 00:35:12
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");

class muchie
{
    public:
    int a,b,cost;
    bool ok;
    muchie(int x,int y,int q)
     {
        a=x;
        b=y;
        cost=q;
        ok=0;
    };
};

class graf
{
    public:
    vector<muchie>muchii;
    int n,m,tata[100000];
    void initializeaza();
    int radacina(int);
    void uneste(int,int);
    int unite(int,int);
    graf();
    void algkrus();
};


bool comp(muchie a ,muchie b)
{
    return a.cost<b.cost;
}

 graf::graf()
{
    int a,b,c ;
    f>>n>>m;
    for (int i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        muchii.push_back(muchie(a,b,c));
    }
}

void graf::initializeaza()
{
     for (int i=1;i<=n;i++) tata[i]=i;
}


int graf::radacina(int x)
{
    if (x==tata[x]) return x;
    tata[x]=radacina(tata[x]);
    return tata[x];
}

void graf::uneste(int a,int b)
{   int A=a,B=b;
    a=radacina(a);
    b=radacina(b);
    if (B>A) tata[a]=b ;
    else tata[b]=a;
}

int graf::unite(int a,int b)
{
    a=radacina(a);
    b=radacina(b);
    return a==b;
}
void graf::algkrus()
{
    initializeaza();
    sort(muchii.begin(),muchii.end(),comp);
    int a,b,c;
    int cost=0,nr=0 ;

    for (int i=0;i<m;i++)
    {
        a=muchii[i].a ;
        b=muchii[i].b ;
        c=muchii[i].cost ;
        if(!unite(a,b))
        {
            uneste(a,b);
            muchii[i].ok=1;
            cost=cost+c;
            nr++;
        }

    }

    g<<cost<<"/n";
    g<<nr<<"/n";
    for (int i=0;i<m;i++)
        if (muchii[i].ok) g<<muchii[i].a<<" "<< muchii[i].b<<"/n";
}

int main()
{
    graf graf1 ;
    graf1.algkrus() ;
    f.close();
    g.close();
    return 0 ;
}