Cod sursa(job #2706321)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 14 februarie 2021 16:33:15
Problema Arbore partial de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MX 200001
#define inf 2147483647

using namespace std;

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

int n, m, total;
vector < pair<int,int> > v[MX];
int key[MX], P[MX];
bool fr[MX];

void citire()
{
    fin>>n>>m;
    int x, y, cost;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>cost;
        v[x].push_back({y,cost});
        v[y].push_back({x,cost});
    }
    fin.close();
}

int min_key()
{
    int minim=inf, ind=0;
    for(int i=1;i<=n;i++)
    {
        if(fr[i]==false and key[i]<minim)
        {
            minim=key[i];
            ind=i;
        }
    }
    total+=minim;
    return ind;
}

void Prim(int start)
{
    for(int i=1;i<=n;i++)
        key[i]=inf;
    key[start]=0;
    P[start]=start;

    int nod, vecin, cost;
    for(int i=1;i<=n;i++)
    {
        nod=min_key();
        fr[nod]=true;
        for(int i=0;i<v[nod].size();i++)
        {
            vecin=v[nod][i].first;
            cost=v[nod][i].second;
            if(fr[vecin]==false and cost<key[vecin])
            {
                key[vecin]=cost;
                P[vecin]=nod;
            }
        }
    }

}

void afisare()
{
    fout<<total<<'\n';
    fout<<n-1<<'\n';
    for(int i=2;i<=n;i++)
        fout<<P[i]<<' '<<i<<'\n';
    fout.close();
}

int main()
{
    citire();
    Prim(1);
    afisare();
    return 0;
}