Cod sursa(job #1886841)

Utilizator razvan99hHorhat Razvan razvan99h Data 21 februarie 2017 10:31:31
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define DM 200005
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n, m, a, b, c, sum;
vector < pair<int, int> > g[DM];
int arb[DM];
priority_queue < pair<int, pair<int,int> > > pq;
bool viz[DM];

void make_apm(int start)
{
    pq.push(make_pair(0,make_pair(1,0))); // first e dist, second e nodul
    while(!pq.empty())
    {
        int nod = pq.top().second.first;
        int venit_din = pq.top().second.second;
        int dist = pq.top().first;
        pq.pop();

        if(!viz[nod])
        {
            viz[nod] = 1;
            sum = sum - dist;
            //cout<<nod<<" "<<venit_din<<endl;
            arb[nod] = venit_din;

            for(auto it: g[nod])
                if(!viz[it.first])
                    pq.push(make_pair(-it.second,make_pair(it.first,nod)));
        }
    }

}

int main()
{
    fin >> n >> m;
    for( int i = 1 ; i <= m; i++)
    {
        fin >> a >> b >> c;
        g[a].push_back(make_pair(b,c)); //first e nodul, second e dist
        g[b].push_back(make_pair(a,c));
    }
    make_apm(1);
    fout << sum << '\n' << n-1 << '\n';
    for(int i = 2 ; i <= n; i++)
        fout << i << ' ' << arb[i] << '\n';
    return 0;
}