Cod sursa(job #1260360)

Utilizator bullseYeIacob Sergiu bullseYe Data 11 noiembrie 2014 10:35:59
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <algorithm>
#define DMAX 200001
#define MMAX 400001
using namespace std;

struct pack{
    int x, y;
    double cost;
};

struct pack muchii[MMAX];
int APM[DMAX];//indicii muchiilor selectate
int cost_APM, lg_APM;
int n, m, conex[DMAX];

bool cmp (struct pack, struct pack);
void citire();
void kruskal();
void afisare();

int main()
{
    citire();
    sort (muchii+1, muchii+m+1, cmp);
    kruskal();
    afisare();
    return 0;
}

void citire()
{
    ifstream fin ("apm.in");
    int i;
    fin>>n>>m;
    for (i=1; i<=m; ++i)
    {
        fin>>muchii[i].x>>muchii[i].y>>muchii[i].cost;
        conex[i]=i;
    }

    for (; i<=n; ++i)//daca m<n
        conex[i]=i;
    fin.close();
    return;
}

bool cmp (struct pack a, struct pack b)
{
    return a.cost<b.cost;
}

void kruskal()
{
    int i, j, minimus, maximus;
    for (i=1; i<=n; ++i)
    {
        //pot selecta muchia i?
        if (conex[muchii[i].x]!=conex[muchii[i].y])
        {
            cost_APM+=muchii[i].cost;
            APM[++lg_APM]=i;
            minimus=conex[muchii[i].x]; maximus=conex[muchii[i].y];
            if (maximus<minimus)
                {
                    minimus=muchii[i].y;
                    maximus=muchii[i].x;
                }
            for (j=1; j<=n; ++j)
                if (conex[j]==maximus)
                    conex[j]=minimus;
        }
    }
    return;
}

void afisare()
{
    ofstream fout ("apm.out");
    int i;
    fout<<cost_APM<<"\n"<<lg_APM<<"\n";
    for (i=1; i<=lg_APM; ++i)
        fout<<muchii[APM[i]].x<<" "<<muchii[APM[i]].y<<" "<<muchii[APM[i]].cost<<"\n";
    fout.close();
    return;

}