Cod sursa(job #2424820)

Utilizator teodor.dumitrescuDumitrescu Teodor teodor.dumitrescu Data 23 mai 2019 21:37:58
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
vector <pair<int,int> > graf[200005];
int viz[200005];
vector <pair<int,int> > muchii;
priority_queue <tuple<int,int,int> > heap;

int prim(int N, int S)
{
    viz[S]=1;
    int cost=0,x,y,c,i,lim,nr_muchii=0;
    tuple<int,int,int> tuplu;
    lim=graf[S].size();
    for(i=0;i<lim;i++)
        heap.push(make_tuple(-graf[S][i].second,S,graf[S][i].first));
    while(nr_muchii!=N-1)
    {
        tuplu=heap.top();
        heap.pop();
        c=-get<0>(tuplu);
        x=get<1>(tuplu);
        y=get<2>(tuplu);
        if(viz[x]==1 && viz[y]==0)
        {
            muchii.push_back(make_pair(x,y));
            nr_muchii++;
            viz[y]=1;
            lim=graf[y].size();
            for(i=0;i<lim;i++)
                if(viz[graf[y][i].first]==0)
                heap.push(make_tuple(-graf[y][i].second,y,graf[y][i].first));
            cost+=c;
        }
        if(viz[x]==0 && viz[y]==1)
        {
            muchii.push_back(make_pair(x,y));
            nr_muchii++;
            viz[x]=1;
            lim=graf[x].size();
            for(i=0;i<lim;i++)
                if(viz[graf[x][i].first]==0)
                heap.push(make_tuple(-graf[x][i].second,x,graf[x][i].first));
            cost+=c;
        }
    }
    return cost;
}
int main()
{
    ifstream in("apm.in");
    ofstream out("apm.out");
    int N,M,x,y,c,i,cost;
    in>>N>>M;
    for(i=1;i<=M;i++)
    {
        in>>x>>y>>c;
        graf[x].push_back(make_pair(y,c));
        graf[y].push_back(make_pair(x,c));
    }
    cost=prim(N,1);
    out<<cost<<"\n";
    out<<N-1<<"\n";
    for(i=0;i<N-1;i++)
        out<<muchii[i].first<<" "<<muchii[i].second<<"\n";
    return 0;
}