Cod sursa(job #1650527)

Utilizator Burbon13Burbon13 Burbon13 Data 11 martie 2016 18:55:42
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <queue>

using namespace std;

const int nmx = 200002;

int n,m,sum;
vector <pair<int,int> > g[nmx],ans;
bitset <nmx> viz;

void citire(){
    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].push_back(make_pair(nod2,cost));
        g[nod2].push_back(make_pair(nod1,cost));
    }
}

void apm(){
    priority_queue <pair<int,pair<int,int> > > q;
    viz[1] = true;
    for(vector<pair<int,int> >::iterator it = g[1].begin(); it != g[1].end(); ++it)
        q.push(make_pair(-(it->second),make_pair(it->first,1)));
    int t = 1;
    while(t < n){
        int nod = q.top().second.first;
        int cost = -q.top().first;
        int tata = q.top().second.second;
        q.pop();
        if(viz[nod])
            continue;
        viz[nod] = true;
        sum += cost;
        ++ t;
        ans.push_back(make_pair(nod,tata));
        for(vector<pair<int,int> >::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
            if(not viz[it->first])
               q.push(make_pair(-(it->second),make_pair(it->first,nod)));
    }
}

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

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