Cod sursa(job #1645261)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 10 martie 2016 11:42:34
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
const int N=200001;
int n,m,cost;
struct heap
{
    int nod,cost,venit;
};
vector<pair<int,int> >apm;
vector<heap>H[N];
vector<heap>::iterator it;
bitset<N>uz;
struct cmp
{
    bool operator()(const heap &a,const heap &b)
    {
        return a.cost>b.cost;
    }
};
priority_queue<heap,vector<heap>,cmp>Q;
void read()
{
    scanf("%d%d",&n,&m);
    int a;heap b;
    while(m--)
    {
        scanf("%d%d%d",&a,&b.nod,&b.cost);
        H[a].push_back(b);
        swap(a,b.nod);
        H[a].push_back(b);
    }
}
void prim()
{
    heap step;
    uz[1]=1;
    for(it=H[1].begin();it!=H[1].end();it++)
    {
        it->venit=1;
        Q.push(*it);
    }
    for(int i=2;i<=n;++i)
    {
        while(uz[Q.top().nod]==1) Q.pop();
        step=Q.top();
        Q.pop();
        uz[step.nod]=1;
        cost+=step.cost;
        for(it=H[step.nod].begin();it!=H[step.nod].end();it++)
        {
            if(uz[it->nod]==0)
            {
                it->venit=step.nod;
                Q.push(*it);
            }
        }
        apm.push_back(make_pair(step.venit,step.nod));
    }
}
void write()
{
    printf("%d\n%d\n",cost,n-1);
    for(vector<pair<int,int> >::iterator a=apm.begin();a!=apm.end();a++) printf("%d %d\n",a->first,a->second);
}
int main()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    read();
    prim();
    write();
}