Cod sursa(job #1025631)

Utilizator cristitamasTamas Cristian cristitamas Data 10 noiembrie 2013 13:11:03
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <algorithm>
#define Max(x,y) (x>y?x:y)
#define Min(x,y) (x<y?x:y)
using namespace std;


struct muchie
{
    int x,y;
    int Cost;
}U[400005],Muchii[400005];
int Nrm;
int CostAPM;
int N,M;
int CompC[200010];

bool Cmp(muchie A, muchie B)
{
        return A.Cost<B.Cost;
}

void Citire_si_formare()
{
    ifstream f("apm.in");
    f>>N>>M;
    for(int i=1;i<=M;++i)
        f>>U[i].x>>U[i].y>>U[i].Cost;
    for(int i=1;i<=N;++i)
        CompC[i]=i;
    f.close();
}

void Kruskal()
{
    for(int i=1,k=0;k<N-1;++i)
    {
        if(CompC[U[i].x]!=CompC[U[i].y])
        {
            Muchii[Nrm++]=U[i];
            CostAPM+=U[i].Cost;
            ++k;
            int Minim=Min(CompC[U[i].x],CompC[U[i].y]);
            int Maxim=Max(CompC[U[i].x],CompC[U[i].y]);
            for(int i=1;i<=N;++i)
                if(CompC[i]==Maxim)
                    CompC[i]=Minim;
        }
    }
}

void Afisare()
{
    ofstream fout("apm.out");
    fout<<CostAPM<<"\n";
    fout<<Nrm<<"\n";
    for(int i=0;i<Nrm;++i)
        fout<<Muchii[i].x<<" "<<Muchii[i].y<<"\n";
    fout.close();
}


int main()
{
    Citire_si_formare();
    sort(U+1,U+M+1,Cmp);
    Kruskal();
    Afisare();
    return 0;
}