Cod sursa(job #921653)

Utilizator dariusgDarius Galis dariusg Data 21 martie 2013 10:34:22
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>
FILE *f=fopen("kruskal.in","r");
FILE *g=fopen("krukal.out","w");

int n,i,sw,k,j,cost,m;
int l[200001];

struct nod
{
    int ei,ef,c;
}v[400001],aux;

struct lista
{
    int ei,ef;
}vect[200000];


int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++)
        fscanf(f,"%d %d %d",&v[i].ei,&v[i].ef,&v[i].c);


    do
    {
        sw=0;
        for(i=1;i<m;i++)
            if(v[i].c>v[i+1].c)
            {
                aux=v[i];
                v[i]=v[i+1];
                v[i+1]=aux;
                sw=1;
            }
            else
                if(v[i].c==v[i+1].c)
                    if(v[i].ei>v[i+1].ei)
                    {
                        aux=v[i];
                        v[i]=v[i+1];
                        v[i+1]=aux;
                        sw=1;
                    }
                    else
                        if(v[i].ei==v[i].ei)
                            if(v[i].ef>v[i].ef)
                            {
                                aux=v[i];
                                v[i]=v[i+1];
                                v[i+1]=aux;
                                sw=1;
                            }
    }
    while(sw==1);

    for(i=1;i<=n;i++)
        l[i]=i;

    k=1;
    cost=0;
    i=1;

    while(k<n)
    {
        if(l[v[i].ei]!=l[v[i].ef])
        {
            vect[k].ei=v[i].ei;
            vect[k].ef=v[i].ef;
            k++;
            cost+=v[i].c;
            for(j=1;j<=n;j++)
                if(l[j]==l[v[i].ei])
                    l[j]=l[v[i].ef];
        }
        i++;
    }


    k--;
    fprintf(g,"%d\n%d\n",cost,k);

    for(i=1;i<=k;i++)
        fprintf(g,"%d %d\n",vect[i].ei,vect[i].ef);


    fclose(f);
    fclose(g);

    return 0;
}