Cod sursa(job #1435332)

Utilizator andreea_cosaCosa Andreea andreea_cosa Data 12 mai 2015 21:30:58
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include<fstream>

using namespace std;
#define NMAX=200001;
#define MMAX=400001;

struct Graf
{
    int x,y,c;

    void initializare(int _x,int _y,int _c)
    {
        x= _x;
        y= _y;
        c= _c;
    }

    bool operator()(const Graf &A,const Graf &B) //sa stiu care e mai mic
    {
        return A.c < B.c;
    }
};

int N,M,Cost_grag;
Graf E[MMAX];
int Muchii[NMAX];

int Tata[NMAX];
int Inaltime[NMAX];

int gaseste_tata(int x) //ca sa stiu daca au acelasi tata
{
    if(Tata[x]!=x)
        Tata[x]=gaseste_tata(Tata[x]);
    return Tata[x];
}

void adauga(int x,int y)//adauga o muchie la subgraful creat
{
    if(Inaltime[x]<Inaltime[y])
    {
        Tata[x]=y;
        return;
    }
    if(Inaltime[x]>Inaltime[y])
    {
        Tata[y]=x;
        return;
    }
    Tata[x]=y;
    Inaltime[y]++;
}

void citire()
{
    int x,y,c;
    ifstream f("apm.in");
    f>>N>>M;
    for(int i=1;i<=M;i++)
    {
        f>>x>>y>>c;
        E[i].initializare(x,y,c);
    }
}

void Kruskal()
{
    int i,j,x,y,c;
    sort(E+1,E+M+1,Graf());
    for(i=1;i<=N;i++)
        Tata[i]=i;

    for(i=1,j=0;i<=M && j<=N-1;i++)
    {
        x=E[i].x;
        y=E[i].y;
        c=E[i].c;

        if(gaseste_tata(x)==gaseste_tata(y))
            continue;//repeta bucla(de la rpimul for,nu continua algoritmul
        adauga(gaseste_tata(x),gaseste_tata(y));
        Cost_grag+=c;
        Muchii[++j]=i;
    }
}

void afisare()
{
    ofstream g("apm.out");
    g<<Cost_grag<<" "<<N-1<<endl;
    for(int i=1;i<=N-1;i++)
    {
        g<<E[Muchii[i]].x<<" "<<E[Muchii[i]].y;
        g<<endl;
    }
}

int main()
{
    citire();
    Kruskal();
    afisare();
    return 0;
}