Cod sursa(job #1705828)

Utilizator alex95panPandelea Alexandru alex95pan Data 20 mai 2016 23:55:43
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

struct muchie{int x,y,cost;};

struct submult
{
    int p;
    int nivel;
};

bool compar (muchie m1, muchie m2)
{
    return m1.cost < m2.cost;
}

int cauta (submult submultimi[], int v)
{
    if (submultimi[v].p != v)
        return cauta(submultimi, submultimi[v].p);

    return submultimi[v].p;
}

void uniune(submult submultimi[], int u, int v)
{
    int radu = cauta(submultimi, u);
    int radv = cauta(submultimi, v);

    if (radu == radv)
        return;

    if (submultimi[radu].nivel < submultimi[radv].nivel)
        submultimi[radu].p = radv;
    else
        if (submultimi[radu].nivel > submultimi[radv].nivel)
            submultimi[radv].p = radu;

    else
    {
        submultimi[radv].p = radu;
        submultimi[radu].nivel++;
    }
}

submult submultimi[200001];

int main()
{
    fstream f("apm.in",ios::in);
    fstream out("apm.out",ios::out);
    vector<muchie> u;
    vector<muchie> rez;
    int n,m,i,ma,costot=0,j,arbtemp,x,y,cost;


    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>cost;
        muchie m;
        m.x=x;
        m.y=y;
        m.cost=cost;

        u.push_back(m);
    }
    sort(u.begin(), u.end(), compar);

    for(i=1;i<=n;i++)
        submultimi[i].p = i;

    ma=0;
    i=0;

    for(i=0;i<m;i++)
    {
        int radu = cauta(submultimi, u[i].x);
        int radv = cauta(submultimi, u[i].y);

        if (radu != radv)
        {
            ma++;
            muchie mu;
            mu.x=u[i].x;
            mu.y=u[i].y;
            costot += u[i].cost;

            rez.push_back(mu);

            //uniune(submultimi, x, y);

            if (submultimi[radu].nivel < submultimi[radv].nivel)
                submultimi[radu].p = radv;
            else
                if (submultimi[radu].nivel > submultimi[radv].nivel)
                    submultimi[radv].p = radu;
                else
                {
                    submultimi[radv].p = radu;
                    submultimi[radu].nivel++;
                }
        }
        if(ma == n-1)
            break;
    }

    out<<costot<<endl<<n-1<<endl;

    for(i=0;i<n-1;i++)
        out<<rez[i].x<<" "<<rez[i].y<<endl;
}