Cod sursa(job #1577970)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 24 ianuarie 2016 00:56:09
Problema Arbore partial de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct nod
{
    int next,cost;
}pas;
struct heap
{
    int cost,nod,venit;
}step;
vector<nod> H[200001],rest;
vector<nod>::iterator it;
bool uz[200001];
struct cmp
{
    bool operator()(const heap &a,const heap &b)
    {
        return a.cost>b.cost;
    }
};
priority_queue<heap,vector<heap>,cmp>Q;
int main()
{
    int n,m,i,a,tot=0;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>pas.next>>pas.cost;
        H[a].push_back(pas);
        swap(a,pas.next);
        H[a].push_back(pas);
    }
    for(it=H[1].begin();it!=H[1].end();it++)
    {
       step.cost=it->cost;
       step.nod=it->next;
       step.venit=1;
       Q.push(step);
    }
    uz[1]=1;
    int NOD,REP;
    for(i=2;i<=n;i++)
    {
        while(uz[Q.top().nod]==1) Q.pop();
        NOD=Q.top().nod;
        REP=Q.top().cost;
        tot=tot+REP;
        pas.next=Q.top().venit;
        pas.cost=NOD;
        uz[NOD]=1;
        rest.push_back(pas);
        for(it=H[NOD].begin();it!=H[NOD].end();it++)
        {
            if(uz[it->next]==0)
            {
                step.cost=it->cost;
                step.nod=it->next;
                step.venit=NOD;
                Q.push(step);
            }
        }
    }
    fout<<tot<<"\n"<<n-1<<"\n";
    for(it=rest.begin();it!=rest.end();it++) fout<<it->next<<" "<<it->cost<<"\n";
}