Cod sursa(job #1886850)

Utilizator raulrusu99Raul Rusu raulrusu99 Data 21 februarie 2017 10:40:59
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
#define N_MAX 200005
vector <pair<int, int> > G[N_MAX];
priority_queue <pair<int, pair<int, int> > > pq;
int n,m;
int viz[N_MAX], tata[N_MAX], sum;
void prim(int start)
{
    int nod;
    pq.push(make_pair(0, make_pair(1, start)));
    while(!pq.empty())
    {
        pair<int, pair<int, int> > _top = pq.top();
        pq.pop();
        nod = _top.second.second;
        if(viz[nod])
            continue;
        sum += -_top.first;
        viz[nod] = 1;
        tata[nod] = _top.second.first;
        for(auto it : G[nod])
        {
            if(viz[it.first] == 0)
            {
                pq.push(make_pair(-it.second,make_pair(nod, it.first)));
            }
        }
    }
}
int main()
{
    f >> n >> m;
    for(int  i = 1; i <= m; i++)
    {
        int x, y, z;
        f >> x >> y >> z;
        G[x].push_back(make_pair(y, z));
        G[y].push_back(make_pair(x, z));
    }
    prim(1);
    g<<sum<<"\n"<<n-1<<"\n";
    for(int i = 2; i <= n; i++)
        g<<i<<" "<<tata[i]<<"\n";
    return 0;
}