Cod sursa(job #1497143)

Utilizator Burbon13Burbon13 Burbon13 Data 6 octombrie 2015 10:42:51
Problema Arbore partial de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;

const int nmx = 200005;

int n, m, suma;
vector <pair<int,int> > g[nmx], r;

void prim(){
    int nod_s, nod_adaug, cost;
    priority_queue <pair<int,pair<int,int> > > q;
    bitset <nmx> viz;
    viz[1] = 1;
    for(vector<pair<int,int> >::iterator it = g[1].begin(); it != g[1].end(); ++it)
        q.push(make_pair(-it->second,make_pair(1,it->first)));
    for(int i = 2; i <= n; ++i){
        bool ok = 1;
        while(viz[q.top().second.second])
            q.pop();
        cost = -q.top().first;
        nod_s = q.top().second.first;
        nod_adaug = q.top().second.second;
        viz[nod_adaug] = 1;
        q.pop();
        r.push_back(make_pair(nod_s,nod_adaug));
        suma += cost;
        for(vector<pair<int,int> >::iterator it = g[nod_adaug].begin(); it != g[nod_adaug].end(); ++it)
            if(not viz[it->first])
                q.push(make_pair(-it->second,make_pair(nod_adaug,it->first)));
    }
}

void afish(){
    printf("%d\n%d\n", suma, r.size());
    for(vector<pair<int,int> >::iterator it = r.begin(); it != r.end(); ++it)
        printf("%d %d\n", it->first, it->second);
}

int main(){
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; ++i){
        int nod1, nod2, cost;
        scanf("%d %d %d", &nod1, &nod2, &cost);
        g[nod1].push_back(make_pair(nod2,cost));
        g[nod2].push_back(make_pair(nod1,cost));
    }
    prim();
    afish();
    return 0;
}