Cod sursa(job #2349820)

Utilizator marcogoldPop Mihali Marco Silviu marcogold Data 20 februarie 2019 19:03:18
Problema Arbore partial de cost minim Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

ofstream fo("apm.out");
ifstream fi("apm.in");

struct muchie
{
    int nod,venit;
    int cost;
};

bool operator <(muchie x,muchie y)
{
    if(x.cost<y.cost)
        return false;
    return true;
}

priority_queue<muchie> coada;
vector <muchie> solutie;
vector <muchie> vecini[200005];
long long suma;
int m,a,b,c;
unsigned n;
bool viz[200005];
int main()
{
    fi>>n>>m;

    for(int i=1; i<=m; i++)
    {
        fi>>a>>b>>c;
        muchie noua;
        noua.nod=b;
        noua.cost=c;
        noua.venit=a;
        vecini[a].push_back(noua);
        noua.nod=a;
        noua.venit=b;
        vecini[b].push_back(noua);
    }


    /// fixam nod 1 ca root

    viz[1]=true;

    for(muchie v:vecini[1])
    {
        coada.push(v);
    }


    while(coada.empty()==false && solutie.size()<n-1)
    {
        while( viz[coada.top().nod] )
        coada.pop();

        int Curent=coada.top().nod;
        int Cost=coada.top().cost;

        suma+=Cost;
        viz[Curent]=true;
        solutie.push_back(coada.top());


        for(muchie v:vecini[Curent])
            if(viz[v.nod]==false)
                coada.push(v);

    }

    fo<<suma<<'\n';
    fo<<solutie.size()<<'\n';
    for(muchie sol:solutie)
        fo<<sol.nod<<" "<<sol.venit<<'\n';

    fi.close();
    fo.close();
    return 0;
}