Cod sursa(job #2423092)

Utilizator WoodsOfYpresAdora Vivos WoodsOfYpres Data 20 mai 2019 19:00:39
Problema Arbore partial de cost minim Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <tuple>

using namespace std;

vector <pair<int,int> > muchii;
priority_queue <tuple<int,int,int> >coada;
int tata[200005];
int rang[200005];
int find_father(int x)
{
    if(x==tata[x])
        return x;
    return find_father(tata[x]);
    tata[x]=tata[tata[x]];
}
void unite(int x, int y)
{
    if(rang[x]>rang[y])
        tata[y]=x;
    if(rang[x]<rang[y])
        tata[x]=y;
    if(rang[x]==rang[y])
    {
        tata[x]=y;
        rang[y]++;
    }
}
int kruskal(int N, int M)
{
    int x,y,c,cost=0,tx,ty;
    tuple <int,int,int> tuplu;
    while(coada.empty()==0)
    {
        tuplu=coada.top();
        coada.pop();
        c=-get<0>(tuplu);
        x=get<1>(tuplu);
        y=get<2>(tuplu);
        tx=find_father(x);
        ty=find_father(y);
        if(tx!=ty)
        {
            unite(tx,ty);
            muchii.push_back(make_pair(x,y));
            cost+=c;
            //nr_muc++;
        }
    }
    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;
        coada.push(make_tuple(-c,x,y));
    }
    for(i=1;i<=N;i++)
    {
        tata[i]=i;
        rang[i]=1;
    }
    cost=kruskal(N,M);
    out<<cost<<endl;
    int lim=muchii.size();
    out<<lim<<endl;
    for(i=0;i<lim;i++)
        out<<muchii[i].first<<" "<<muchii[i].second<<endl;
    return 0;
}