Cod sursa(job #2425831)

Utilizator mariusilieMarius Ilie mariusilie Data 25 mai 2019 07:53:09
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
#define NLIM 200001

using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");

int n, m, tata[NLIM], dis[NLIM], viz[NLIM];
vector< pair<int, int> > Muchii[NLIM];
struct compare {
    bool operator()(pair<int,int> a, pair<int, int> b) {
        return a.second > b.second;
    }
};
priority_queue<pair<int,int>, vector< pair<int, int> >, compare> Coada;

void Prim(int start) {
    Coada.push(make_pair(start, 0));
    dis[start] = 0;

    while(!Coada.empty()) {
        int nod = Coada.top().first;
        Coada.pop();

        for(int i=0; i<Muchii[nod].size(); i++) {
            int vecin = Muchii[nod][i].first;
            int cost = Muchii[nod][i].second;

            if(!viz[vecin] && cost < dis[vecin]) {
                dis[vecin] = cost;
                tata[vecin] = nod;
                viz[nod] = 1;
                Coada.push(make_pair(vecin, cost));
            }
        }
    }
}

void citire() {
    f >> n >> m;
    for(int i=1; i<=n; i++) {
        viz[i] = 0;
        tata[i] = -1;
        dis[i] = INT_MAX;
    }
    for(int i=1; i<=m; i++) {
        int s, d, c;
        f >> s >> d >> c;
        Muchii[s].push_back(make_pair(d, c));
        Muchii[d].push_back(make_pair(s, c));
    }
}
void afisare() {
    int sum = 0, count = 0;
    for(int i=1; i<=n; i++) {
        if(tata[i] != -1)
            count += 1;
        sum += dis[i];
    }
    g << sum << '\n' << count << '\n';
    for(int i=1; i<=n; i++)
        if(tata[i] != -1)
            g << tata[i] << ' ' << i << '\n';
}

int main() {
    citire();
    Prim(1);
    afisare();
    return 0;
}