Cod sursa(job #2425250)

Utilizator boguklMirzea Bogdan bogukl Data 24 mai 2019 17:25:52
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <vector>
#include <set>
#include <fstream>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");


void prim(vector<vector<pair<int,int> > >&graf,int n)
{
    vector<int> dist(n+1,INT_MAX);
    vector<int> tata(n+1);
    dist[1]=0;
    tata[1]=0;

    set<pair<int,pair<int,int> > >s;


    for(auto muchie:graf[1])
    {
        s.insert({muchie.first,{1,muchie.second}});
    }

    int contor=0;

    while(contor<n-1)
    {
        pair<int,pair<int,int> >pt=*(s.begin());
        s.erase(s.begin());

        if(dist[pt.second.second]==INT_MAX)
        {
            dist[pt.second.second]=pt.first;
            tata[pt.second.second]=pt.second.first;
            contor++;
            for(auto muchie:graf[pt.second.second])
            {
                if(dist[muchie.second]==INT_MAX)
                {
                    s.insert({muchie.first,{pt.second.second,muchie.second}});
                }
            }
        }
    }

    int total=0;
    for(int i=1;i<n+1;i++)
        total+=dist[i];

    fout<<total<<'\n';
    fout<<n-1<<'\n';

    for(int i=2;i<n+1;i++)
        fout<<i<<' '<<tata[i]<<'\n';
}

int main()
{

   int n,m;
   fin>>n>>m;

   vector<vector<pair<int,int> > >graf(n+1);

   for(int i=0;i<m;i++)
   {
       int a,b,cost;
       fin>>a>>b>>cost;
       graf[a].push_back({cost,b});
       graf[b].push_back({cost,a});
   }

    prim(graf,n);
    return 0;
}