Cod sursa(job #1110008)

Utilizator GabiMMarincu Gabriel GabiM Data 17 februarie 2014 19:35:02
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <algorithm>

#define max_n 200000
#define max_m 400000

using namespace std;

ifstream input("apm.in");
ofstream output("apm.out");

struct costuri {
    int x,y,c;
};

int n,m,i,j,xi,yi,ci,cost,total,k,nr,q;
costuri muchie[max_m];
int T[max_n],rang[max_n];
int sol[max_m][2];

int multime(int x)
{
    if (T[x]!=x)
        T[x] = multime(T[x]);
    return T[x];
}

bool cmp(costuri a, costuri b)
{
    return a.c<b.c;
}

void reuneste(int i,int j) {
    i=multime(i);
    j=multime(j);
    if (i==j) return;
    if (rang[i]<rang[j])
        T[i]=j;
    else
        T[j]=i;
    if (rang[i]==rang[j])
        rang[i]++;
}

int main()
{
    input >> n >> m;
    for (i=1;i<=m;i++)
    {
        input >> xi >> yi >> ci;
        muchie[i].x = xi;
        muchie[i].y = yi;
        muchie[i].c = ci;
    }

    sort(muchie+1,muchie+m+1,cmp);
    for (i=1;i<=n;i++)
    {
        T[i] = i;
        rang[i] = 0;
    }

    q = 0;
    for (i=1;i<=m;i++)
    {
        j = muchie[i].x;
        k = muchie[i].y;
        cost = muchie[i].c;
        if (multime(j)!=multime(k))
        {
            reuneste(j,k);
            total +=cost;
            q++;
            sol[q][0] = k;
            sol[q][1] = j;
        }
    }
    output << total << " "<< q << endl;
    for (i=1;i<=q;i++)
    {
        output << sol[i][0] <<" " << sol[i][1] << endl;
    }
    return 0;
}