Cod sursa(job #916319)

Utilizator robert.onesimRobert Onesim robert.onesim Data 16 martie 2013 12:38:45
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 10003
#define MMAX 400003
FILE *fin,*fout;
using namespace std;
//ifstream fin("flood.in");
//ofstream fout("flood.out");
struct muchie {int x,y,cost; bool ok;};
muchie Muchie[MMAX];
void citire();
void apm();
int n,m,Tata[NMAX],H[NMAX],drumuri,ctotal;
bool comp(muchie a, muchie b)
{
    return a.cost<b.cost||(a.cost==b.cost &&a.x<b.x);
}
int main()
{
    int i;
    citire();
    sort(Muchie+1,Muchie+m+1,comp);
    apm();
}
void citire()
{
    fin=fopen("apm.in","r");
    fout=fopen("apm.out","w");
    int a,b,c,i;
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(fin,"%d%d%d",&a,&b,&c);
        Muchie[i].x=a;
        Muchie[i].y=b;
        Muchie[i].cost=c;
        Muchie[i].ok=0;
    }

}
void Union(int i, int j)
{
    if(H[i]<H[j]) Tata[i]=j;
    else
        if(H[i]>H[j]) Tata[j]=i;
            else {Tata[j]=i;H[i]++;}
}
int Find(int care)
{
    int aux,rad;
    rad=care;
    while(Tata[rad]!=0) rad=Tata[rad];
    // compresia drumului
    while(care!=rad) {H[care]=0; aux=Tata[care]; Tata[care]=rad; care=aux; }
    return rad;
}

void apm()
{
    int k,cx,cy,i;
    int poz=1;
    for(k=1; k<=n-1;  )
    {
        cx=Find(Muchie[poz].x);
        cy=Find(Muchie[poz].y);
        if(cx!=cy)
        {
            drumuri++;
            ctotal+=Muchie[poz].cost;
            Muchie[poz].ok=1;
            k++;
            Union(cx,cy);
         }
       poz++;
    }
    fprintf(fout,"%d\n%d\n",ctotal,drumuri);
     for(i=1;i<=m;i++)
     if(Muchie[i].ok==1)
        fprintf(fout,"%d %d\n",Muchie[i].y,Muchie[i].x);
}