Cod sursa(job #2846756)

Utilizator CarlaDianaCarla Diana CarlaDiana Data 9 februarie 2022 17:09:12
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream> 
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int main()
{
    int n,m,a,b,c,finalcost;
    fin>>n>>m;
    vector<vector<pair<int,int>>> v(n+1);  //.first-vertex;.second-cost
    priority_queue<pair < int, pair<int,int> > ,vector<pair < int, pair<int,int> >>,greater<pair < int, pair<int,int> >> > q;
    
    while(m)
    {
        m--;
        fin>>a>>b>>c;
        v[a].push_back(make_pair(b,c));
        v[b].push_back(make_pair(a,c));
    }
    finalcost=0;
    bool visited[n+1];
    visited[1]=1;//start from 1
    for(int i=2;i<=n;i++)
        visited[i]=0;
    
    
    
    for(int i=0;i<v[1].size();i++)
    {
        q.push(make_pair(v[1][i].second,make_pair(1,v[1][i].first)));
    }
    
    pair < int, pair<int,int> >  actualedge;
    
    vector<pair<int,int>>res;
    
    for(int i=1;i<n;i++) //add n-1 vertexes
    {
        actualedge=q.top();
        q.pop();
        while(visited[actualedge.second.second])
        {
            actualedge=q.top();
            q.pop();
            
        }
        
        visited[actualedge.second.second]=1;
        finalcost+=actualedge.first;
        res.push_back(make_pair(actualedge.second.first,actualedge.second.second));
        
        for(int j=0;j<v[actualedge.second.second].size();j++)
        {
            if(visited[v[actualedge.second.second][j].first]==0)
            q.push(make_pair(v[actualedge.second.second][j].second,make_pair(actualedge.second.second,v[actualedge.second.second][j].first)));
        }
        
    }
    
    fout<<finalcost<<'\n'<<n-1<<'\n';
    for(auto i=res.begin();i<res.end();i++)
        fout<<(*i).first<<" "<<(*i).second<<'\n';
    
    
    
    
    return 0;
}