Cod sursa(job #2417735)

Utilizator WoodsOfYpresAdora Vivos WoodsOfYpres Data 30 aprilie 2019 22:49:53
Problema Arbore partial de cost minim Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <tuple>

using namespace std;

priority_queue <tuple<int,int,int> > coada;
vector <int> graf[200005];
vector <int> grafc[200005];
vector <tuple<int,int,int> > muchii;

int viz[200005];
int cost;
void Prim(int nod, int N)
{
    int i,lim,x,y,c,cnt=0;
    tuple <int,int,int> tuplu;
    viz[nod]=1;
    lim=graf[nod].size();
    for(i=0;i<lim;i++)
        coada.push(make_tuple(-grafc[nod][i],nod,graf[nod][i]));
    while(cnt<N-1)
    {
        tuplu=coada.top();
        coada.pop();
        c=-get<0>(tuplu);
        x=get<1>(tuplu);
        y=get<2>(tuplu);
        if(viz[x]==0 || viz[y]==0)
        {
            if(viz[x]==0)
            {
                muchii.push_back(make_tuple(x,y,c));
                cnt++;
                cost=cost+c;
                viz[x]=1;
                lim=graf[x].size();
                for(i=0;i<lim;i++)
                {
                    coada.push(make_tuple(-grafc[x][i],x,graf[x][i]));

                }
            }
            if(viz[y]==0)
            {
                muchii.push_back(make_tuple(x,y,c));
                cnt++;
                cost=cost+c;
                viz[y]=1;
                lim=graf[y].size();
                for(i=0;i<lim;i++)
                {
                    coada.push(make_tuple(-grafc[y][i],y,graf[y][i]));
                }
            }
        }
    }

}
int main()
{
    ifstream f("apm.in");
    ofstream g("apm.out");
    int i,N,M,x,y,c,lim;
    f>>N>>M;
    for(i=1;i<=M;i++)
    {
        f>>x>>y>>c;
        graf[x].push_back(y);
        graf[y].push_back(x);
        grafc[x].push_back(c);
        grafc[y].push_back(c);
    }
    Prim(1,N);
    g<<cost<<endl;
    lim=muchii.size();
    g<<lim<<endl;
    for(i=0;i<lim;i++)
        g<<get<0>(muchii[i])<<" "<<get<1>(muchii[i])<<endl;
    return 0;
}