Cod sursa(job #2552194)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 20 februarie 2020 17:39:36
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <queue>
using namespace std;

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

const int NMAX=200010;
int n,m;
int p[NMAX];
int costTotal;
struct muchie{
    int a,b,c;
};
struct comparator{
    bool operator()(muchie a,muchie b){
        return a.c>b.c;
    }
};
priority_queue<muchie,vector<muchie>,comparator>q;
queue<muchie>qSol;
void citire()
{
    fin>>n>>m;
    muchie cont;
    for (int i=1; i<=n; i++)
        p[i]=i;
    for (int i=1; i<=m; i++){
        fin>>cont.a>>cont.b>>cont.c;
        q.push(cont);
    }
}
int findSet(int i)
{
    if (p[i]==i)
        return i;
    return (p[i]=findSet(p[i]));
}
bool sameSet(int a,int b)
{
    return (findSet(a)==findSet(b));
}
void unionSet(int a, int b)
{
    if (p[a]<p[b]){
        p[p[a]]=p[b];
    }else{
        p[p[b]]=p[a];
    }
}
void kruskal()
{
    muchie cont;
    for (int i=1; i<=n-1; i++){
        cont=q.top();
        q.pop();
        while (sameSet(cont.a,cont.b)){
            cont=q.top();
            q.pop();
        }
        qSol.push(cont);
        costTotal+=cont.c;
        unionSet(cont.a,cont.b);
    }
}
void afisare()
{
    fout<<costTotal<<'\n';
    fout<<n-1<<'\n';
    muchie cont;
    while (!qSol.empty()){
        cont=qSol.front();
        qSol.pop();
        fout<<cont.a<<' '<<cont.b<<'\n';
    }
}
int main()
{
    citire();
    kruskal();
    afisare();
    return 0;
}