Cod sursa(job #1190906)

Utilizator alexsuciuAlex Suciu alexsuciu Data 25 mai 2014 21:59:25
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream f("apm.in");
ofstream g("apm.out");

int N,M,CostTotal,h[200000],p[200000],nr;

struct muchie
{
    int x,y,cost;
}Muchie[400000],MuchieNou[200000];

void citire(int &N, int &M)
{
    f>>N>>M;
    for(int i=0;i<M;i++)
        f>>Muchie[i].x>>Muchie[i].y>>Muchie[i].cost;
}

bool compara(muchie a, muchie b)
{
    return a.cost<b.cost;
}

void MakeSet(int u)
{
    h[u]=0;
    p[u]=0;
}

int FindSet(int u)
{
    if (p[u]==0)
    return u;
    p[u]=FindSet(p[u]); //tatal lui u devine radacina
    return p[u];
}

void Union(int u,int v)
{
    u=FindSet(u);
    v=FindSet(v);
    if (h[u]>h[v])
        p[v]=u;
            else
               {
                p[u]=v;
                if(h[u]==h[v])
                    h[v]=h[v]+1;
               }
}



int main()
{
int i;
    citire(N,M);
    sort(Muchie,Muchie+M,compara);
    for(i=0;i<M;i++)
        if(FindSet(Muchie[i].x)!=FindSet(Muchie[i].y))
            {
                MuchieNou[nr++]=Muchie[i];
                Union(Muchie[i].x,Muchie[i].y);
                CostTotal+=Muchie[i].cost;
                if(nr==N-1) break;
            }

    g<<CostTotal<<'\n'<<nr<<'\n';
    for(i=0;i<nr;i++)
        g<<MuchieNou[i].x<<" "<<MuchieNou[i].y<<'\n';

    return 0;
}