Cod sursa(job #969354)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 4 iulie 2013 10:45:40
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <bitset>
#define N 200001
using namespace std;
int m,n,cost;
struct edge { int nod,val,prec;};
vector < pair<int , int> > v[N];
bitset <N> apar;
class cmp
{
    public:
        bool operator () (edge a, edge b)
        {
            return a.val>b.val;
        }
};
priority_queue <edge, vector<edge>, cmp> heap;
void adauga_in_heap(int vf)
{
    edge E;
    int i;
    for (i=0;i<v[vf].size();i++)
    {
        E.prec=vf;
        E.nod=v[vf][i].first;
        E.val=v[vf][i].second;
        heap.push(E);
    }
}
int main()
{
    fstream f,g;
    f.open("apm.in",ios::in);
    g.open("apm.out",ios::out);
    f>>n>>m;
    int i,x,y,z;
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    g<<"           \n"<<n-1<<'\n';
    apar[1]=1;
    adauga_in_heap(1);
    edge E;
    int nod;
    while (!heap.empty())
    {
        E=heap.top();
        heap.pop();
        nod=E.nod;
        if (!apar[nod])
        {
            apar[nod]=1;
            adauga_in_heap(nod);
            cost+=E.val;
            g<<E.prec<<" "<<E.nod<<'\n';
        }
    }
    g.seekg(0,ios::beg);
    g<<cost;
}