Cod sursa(job #1336207)

Utilizator NacuCristianCristian Nacu NacuCristian Data 7 februarie 2015 01:26:44
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int m,n,sum,parinte[200010],k;

struct nod
{
    int x,y,c;
    bool operator()(nod a, nod b)
    {
        return a.c>b.c;
    }
};

priority_queue <nod, vector<nod>,nod> q;
vector<nod> sol;

int tata(int x)
{
    if(parinte[x]==x)
        return x;
    parinte[x]=tata(parinte[x]);
    return parinte[x];

}

int sunt_conectate(int x, int y)
{
    return tata(x)==tata(y);
}

void citire()
{
    freopen("apm.in","r",stdin);
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;i++)
    {
        nod c;
        scanf("%d %d %d", &c.x,&c.y,&c.c);
        q.push(c);
    }
}

void rez()
{

    while(!q.empty())
    {
        nod p=q.top();
        q.pop();
        if(sunt_conectate(p.x,p.y))
            continue;
        sol.push_back(p);
        parinte[tata(p.x)]=tata(p.y);
        sum+=p.c;
        k++;
    }
}

int main()
{
    citire();

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

    rez();

    freopen("apm.out","w",stdout);

    printf("%d\n%d\n",sum,k);
    for(int i=0;i<sol.size();i++)
        printf("%d %d\n",sol[i].x,sol[i].y);
    return 0;
}