Cod sursa(job #1082941)

Utilizator pintilie.andreiPintilie pintilie.andrei Data 15 ianuarie 2014 12:14:08
Problema Arbore partial de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <algorithm>
#define NMAX 200010

using namespace std;

FILE *fin,*fout;

int n, m;
int MINIM, muchii;
int c[NMAX], sol[NMAX];

struct el{int x;int y;int cost;} M[2*NMAX] ;

void Kruskal();
bool comp (el a,el b)
{
    return a.cost<b.cost;
}


int main()
{
    int i;
    fin=fopen("apm.in","r");
    fout=fopen("apm.out","w");

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

    sort(M+1,M+1+m,comp);

    for (i=1;i<=n;i++)
        c[i]=i; //initializarea vectorului

    Kruskal();

    fprintf(fout,"%d\n%d\n",MINIM,n-1);
    for (i=1;i<=n-1;i++)
        fprintf(fout,"%d %d\n",M[sol[i]].x,M[sol[i]].y);
    return 0;
}

void Kruskal()
{
    int i=1,j,minim,maxim;
    while (muchii<n-1)
    {
        if (c[M[i].x]!=c[M[i].y])
        {
            MINIM=MINIM+ M[i].cost;
            muchii++;
            sol[muchii]=i;
            if(c[M[i].x]<c[M[i].y])
            {
                minim=c[M[i].x];
                maxim=c[M[i].x];
            }
            else
            {
                maxim=c[M[i].x];
                minim=c[M[i].y];
            }
            for(j=1;j<=n;j++)
                if(c[j]==maxim)
                    c[j]=minim;

        }
        i++;
    }
}