Cod sursa(job #1261399)

Utilizator Arodoet96Teodora Stoleru Arodoet96 Data 12 noiembrie 2014 12:22:19
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <algorithm>
#define NMAX 200004
#define MMAX 400004

using namespace std;

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

int n, m;
struct muchie
{
    int x, y;
    double cost;
};
muchie M[MMAX];//lista muchiilor

int conex[NMAX];
int APM[NMAX];//indicii celor n-1 muchii selectate
double cost_apm;

void citire();
bool ord(muchie A, muchie B);
void initializare();
void kruskal();
void unific(int x, int y);
void afisare();

int main()
{
    citire();
    sort(M+1, M+m+1, ord);
    initializare();
    kruskal();
    afisare();
    return 0;
}

void citire()
{
    int i;
    fin>>n>>m;
    for(i=1;i<=m;i++)
        fin>>M[i].x>>M[i].y>>M[i].cost;
}

bool ord(muchie A, muchie B)
{
    return A.cost<=B.cost;
}

void initializare()
{
    int i;
    for(i=1;i<=n;i++)
        conex[i]=i;
}

void kruskal()
{
    int i=0, nrm=0;
    while(nrm<n-1)
    {
        ++i;
        while(conex[M[i].x]==conex[M[i].y])
            ++i;

        unific(M[i].x, M[i].y);

        APM[++nrm]=i;
        cost_apm+=M[i].cost;
    }
}

void unific(int x, int y)
{
    int i;
    int a, b;
    if(conex[x]<=conex[y])
    {
        a=conex[x];
        b=conex[y];
    }
        else
        {
            a=conex[y];
            b=conex[x];
        }

    for(i=1;i<=n;i++)
        if(conex[i]==b)
            conex[i]=a;
}

void afisare()
{
    int i;
    fout<<(int)cost_apm<<'\n'<<n-1<<'\n';
    for(i=1;i<n;i++)
        fout<<M[APM[i]].x<<' '<<M[APM[i]].y<<'\n';//fout<<"["<<M[APM[i]].x<<", "<<M[APM[i]].y<<"] "<<' ';
}