Cod sursa(job #3325682)

Utilizator preda_alexandraPreda Maria Alexandra preda_alexandra Data 25 noiembrie 2025 23:06:43
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <tuple>

using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");

vector<vector<pair<int, int>>> graf;
vector<int> viz;
vector<pair<int, int>> tata;
priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> pq;

int N, M;

int prim(int x, int& s, int& nr)
{
    viz[x] = 1;
    //nr = 1;
    int curent, vecin, cost;
    for(auto& vec : graf[x])
    {
        vecin = vec.first;
        cost = vec.second;
        if(viz[vecin] == 0)
        {
            pq.push({cost, x, vecin});
        }
    }

    tuple<int, int, int> nod;

    while(!pq.empty() && nr<N)
    {
        nod = pq.top();
        pq.pop();
        cost = get<0>(nod);
        curent = get<1>(nod);
        vecin = get<2>(nod);

        if(viz[vecin] == 0)
        {
            tata[vecin] = {curent, cost};
            s += cost;
            viz[vecin] = 1;
            curent = vecin;
            nr += 1;
        }
        for(auto& i : graf[curent])
        {
            vecin = i.first;
            cost = i.second;
            if(viz[vecin] == 0)
            {
                pq.push({cost, curent, vecin});
            }
        }

    }

}

int main()
{
    int s= 0, nr = 0;
    fin>>N>>M;
    graf.resize(N+1);
    viz.assign(N+1, 0);
    tata.assign(N+1, {-1,-1});
    for(int i=1; i<=M; i++)
    {
        int X, Y, C;
        fin>>X>>Y>>C;
        graf[X].push_back({Y,C});
        graf[Y].push_back({X,C});
    }

    int start = 1;

    prim(start, s, nr);

    fout<<s<<endl;
    fout<<nr<<endl;
    for(int i=1; i<=N; i++)
    {
        if(tata[i].first != -1)
            fout<<i<<' '<<tata[i].first<<endl;
    }

    return 0;
}