Cod sursa(job #2424477)

Utilizator mariusilieMarius Ilie mariusilie Data 23 mai 2019 04:49:34
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 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");

struct cmpDis {
    bool operator()(pair<int, int> &a, pair<int, int> &b) {
        return a.second > b.second;
    }
};

priority_queue<pair<int, int>, vector< pair<int, int> >, cmpDis> Coada;
vector< pair<int, int> > Muchii[NLIM];
int tati[NLIM], dis[NLIM];
bool viz[NLIM];

void citire(int &n, int &m) {
    f >> n >> m;
    for(int i=1; i<=n; i++) {
        viz[i] = 0;
        dis[i] = INT_MAX;
        tati[i] = -1;
    }
    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 Prim(int start) {
    Coada.push(make_pair(start, 0));
    dis[start] = 0;

    while(!Coada.empty()) {
        int u = Coada.top().first;
        Coada.pop();
        viz[u] = 1;

        for(int i=0; i<Muchii[u].size(); i++) {
            int v = Muchii[u][i].first;
            int c = Muchii[u][i].second;

            if(!viz[v] && c < dis[v]) {
                dis[v] = c;
                Coada.push(make_pair(v, c));
                tati[v] = u;
            }
        }
    }
}

int main() {
    int n, m;

    citire(n, m);
    Prim(1);

    int sum = 0, count = 0;
    for(int i=1; i<=n; i++) {
        if(tati[i] != -1)
            count += 1;
        sum += dis[i];
    }
    g << sum << '\n' << count << '\n';

    for(int i=1; i<=n; i++)
        if(tati[i] != -1)
            g << tati[i] << ' ' << i << '\n';

    return 0;
}