Cod sursa(job #1341022)

Utilizator eliseiDragoslav Elisei elisei Data 12 februarie 2015 12:04:59
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include<fstream>
#include<algorithm>
using namespace std;

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

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

Nod sol[400005];
int s;

Nod a[400005];
int n,m;
int c[200005];
void Citire()
{
    ifstream fin("apm.in");
    fin>>n>>m;
    for(int i=0;i<m;i++)
        fin>>a[i].x>>a[i].y>>a[i].c;
    fin.close();
    sort(a,a+m,cmp);

}

int Get(int x)
{
    if(x==c[x]) return x;
    c[x]=Get(c[x]);
    return c[x];
}

void Unify(int x,int y)
{
    c[Get(y)]=Get(x);
}


void Adauga(int i)
{
    s++;
    sol[s].x=a[i].x;
    sol[s].y=a[i].y;
    sol[s].c=sol[s-1].c+a[i].c;
}

void Rez()
{
    int nr=n;
    int i=0;
    while(nr>1 && i<m)
    {
        int x=Get(a[i].x);
        int y=Get(a[i].y);
        if(x!=y)
        {
            Unify(a[i].x,a[i].y);
            Adauga(i);
            nr--;
        }
        i++;
    }
}

int main()
{
    Citire();

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

    Rez();

    ofstream fout("apm.out");
    fout<<sol[s].c<<"\n"<<s<<"\n";
    for(int i=1;i<=s;i++)
        fout<<sol[i].x<<" "<<sol[i].y<<"\n";

    return 0;
}