Cod sursa(job #1497142)

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

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

int main() {
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    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));
    }

    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)));
    viz[1] = true;

    for(int i = 2; i <= n; ++i) {
        while(viz[q.top().second.second])
            q.pop();
        nod1 = q.top().second.first;
        nod2 = q.top().second.second;
        viz[nod2] = true;
        r.push_back(make_pair(nod1,nod2));
        cost = -q.top().first;
        q.pop();
        sum += cost;
        for(vector<pair<int,int> >::iterator it = g[nod2].begin(); it != g[nod2].end(); ++it)
            if(not viz[it->first])
            q.push(make_pair(-(it->second),make_pair(nod2,it->first)));

    }

    printf("%d\n", sum);
    printf("%d\n", n-1);
    for(int i = 0; i < n - 1; ++i)
        printf("%d %d\n", r[i].first, r[i].second);

    return 0;
}