Cod sursa(job #1449842)

Utilizator FlowstaticBejan Irina Flowstatic Data 10 iunie 2015 19:37:33
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <algorithm>
#define NMAX 200005
#define MMAX 400005
using namespace std;
FILE* fin=fopen("apm.in","r");
FILE* fout=fopen("apm.out","w");

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

muchie Mu[MMAX];
int puse[NMAX];
int C[NMAX];
void CitireListe();
void KruskalNeop();
bool compare(muchie a, muchie b);
void Schimba(int cautat, int valnoua);
int N,M;
int costMin;
void Afisare();

int main()
{

    CitireListe();
    sort(Mu+1, Mu+M+1,compare);
    KruskalNeop();
    Afisare();
    return 0;
}

void CitireListe()
{
    int i;
    muchie a;
    fscanf(fin,"%d %d",&N,&M);

    for(i = 1; i <= M ; i++)
    {
        fscanf(fin,"%d %d %d",&Mu[i].x,&Mu[i].y,&Mu[i].cost);
    }
}

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

void KruskalNeop()
{
    int i;
    int j = 1;
    for(i=1; i<=N; i++)
        C[i] = i;

    for(i=1; i<=N-1; i++)
    {
        while (C[Mu[j].x]==C[Mu[j].y])
            j++;
        if(C[Mu[j].x]<C[Mu[j].y])
            Schimba(C[Mu[j].y],C[Mu[j].x]);
        else
            Schimba(C[Mu[j].x],C[Mu[j].y]);
        puse[i] = j;
        costMin += Mu[j].cost;
        j++;
    }
}

void Schimba(int cautat, int valnoua)
{
    int i;
    for(i=1; i<=N; i++)
        if(C[i] == cautat)
            C[i] = valnoua;
}

void Afisare()
{
    fprintf(fout,"%d\n%d\n",costMin,N-1);
    int i;
    for(i=1; i<=N-1; i++)
        fprintf(fout,"%d %d\n",Mu[puse[i]].x,Mu[puse[i]].y);
}