Cod sursa(job #2979032)

Utilizator proflaurianPanaete Adrian proflaurian Data 14 februarie 2023 18:49:05
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
/// Algoritmul lui Prim
#include <bits/stdc++.h>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
const int N = 100010;
int n,m,x,y,cst,costArbore;
bitset<N> used;
vector<pair<int,int>> v[N],A;
priority_queue<tuple<int,int,int>> M;
int main()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>x>>y>>cst;
        v[x].push_back(make_pair(y,cst));
        v[y].push_back(make_pair(x,cst));
    }
    used[1]=1;
    for(auto it:v[1])
    {
        tie(x,cst)=it;
        M.push(make_tuple(-cst,1,x));
    }
    while(M.size())
    {
        tie(cst,x,y)=M.top();
        M.pop();
        if(used[x]&&used[y])
            continue;
        if(used[y])swap(x,y);
        costArbore-=cst;
        A.push_back(make_pair(x,y));
        used[y]=1;
        for(auto it:v[y])
        {
            tie(x,cst)=it;
            if(!used[x])
                M.push(make_tuple(-cst,y,x));
        }
    }
    g<<costArbore<<'\n';
    g<<A.size()<<'\n';
    for(auto it:A)
    {
        tie(x,y)=it;
        g<<x<<' '<<y<<'\n';
    }
    return 0;
}


//metoda :
//    plecam de la un arbore care contine doar un singur nod ( nodul 1)
//    in mod repetat se procedeaza astfel:
//        la un moment dat avem un arbore incomplet la care am adaugat niste noduri
//        odata cu adaugarea unui nod se adauga muchiile care leaga acel nod
//        de alte noduri care !!! NU SUNT INCA ADAUGATE LA ARBORE !!!
//        se alege mereu cea mai mica muchie
//        care leaga un nod din arbore cu unul care inca nu a fost pus in arbore
//    structura de date necesare
//        -> pentru muchii o coada de prioritati care imi scoate in top
//           cea mai mica muchie disponibila