Cod sursa(job #1565945)

Utilizator Burbon13Burbon13 Burbon13 Data 11 ianuarie 2016 18:05:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
#define pb push_back
#define mp make_pair

using namespace std;

const int nmx = 200002;

int n,m;
long long sum = 0;
vector <pair<int,int> > g[nmx],sol;
priority_queue <pair<int,pair<int,int> > > q;
bitset <nmx> v;

void input() {
    scanf("%d %d", &n, &m);
    int nod1,nod2,cost;
    for(int i = 1; i <= m; ++i) {
        scanf("%d %d %d", &nod1, &nod2, &cost);
        g[nod1].pb(mp(nod2,cost));
        g[nod2].pb(mp(nod1,cost));
    }
}

void apm() {
    v[1] = true;
    for(vector<pair<int,int> >::iterator it = g[1].begin(); it != g[1].end(); ++it)
        q.push(mp(-it->second,mp(it->first,1)));
    int nod,cost,ant;
    while(not q.empty()) {
        nod = q.top().second.first;
        cost = -q.top().first;
        ant = q.top().second.second;
        q.pop();
        if(v[nod])
            continue;
        sum += cost;
        v[nod] = true;
        sol.push_back(mp(ant,nod));
        for(vector<pair<int,int> >::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
            if(not v[it->first])
                q.push(mp(-it->second,mp(it->first,nod)));
    }
}

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

int main() {
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    input();
    apm();
    output();
    return 0;
}