Cod sursa(job #3356552)

Utilizator ilincaSSirbu Ilinca-Maria eu ilincaS Data 2 iunie 2026 12:05:16
Problema Arbore partial de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;
vector<vector<int>> adj;
vector <pair <int, int> > rez;
map <pair<int, int>, int> mp;
priority_queue < tuple <int, int, int> > pq;

int viz[200005], mn = 210000000, sum=0;

void prim(int nod)
{
    for(auto i:adj[nod])
    {
        if(viz[i]==0)
            pq.push(make_tuple((-1)*mp[{nod, i}], i, nod));
    }
    while(!pq.empty() && viz[get<1>(pq.top())]==1){
        pq.pop();
    }
    if(pq.empty())
        return;
    viz[get<1>(pq.top())] = 1;
    sum += get<0>(pq.top())*(-1);
    rez.push_back({get<2>(pq.top()), get<1>(pq.top())});
    nod=get<1>(pq.top());
    pq.pop();
    prim(nod);
}

int main()
{
    ifstream cin("apm.in");
    ofstream cout("apm.out");

    int n, m, x, y, val;
    cin >> n >> m;
    adj.resize(n + 5);
    for(int i = 0; i < m; i++){
        cin >> x >> y >> val;
        mp[{x, y}] = mp[{y, x}] = val;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    viz[1] = 1;
    prim(1);
    cout<<sum<<'\n' << rez.size() << "\n";
    for(int i = 0; i < rez.size(); i++){
        cout << rez[i].first << " " << rez[i].second << "\n";
    }
    return 0;
}