Cod sursa(job #2367516)

Utilizator mihaigrozaGroza Mihai mihaigroza Data 5 martie 2019 11:11:34
Problema Arbore partial de cost minim Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

ifstream f("apm.in");
ofstream g("apm.out");

pair <int,int>p[400005];
int n,m,t[400005],rang[400005],k,total;
struct muchie
{
    int x,y,cost;
}v[400005];
bool cmp(muchie a,muchie b)
{
    return a.cost<b.cost;
}
void citire()
{
   f>>n>>m;
   for(int i=1;i<=m;i++)
       f>>v[i].x>>v[i].y>>v[i].cost;
   for(int i=1;i<=n;i++)
    t[i]=i,rang[i]=1;
   sort(v+1,v+m+1,cmp);
}
int cauta(int nod)
{
    while(t[nod]!=nod)
        nod=t[nod];
    return nod;
}
void unire(int x,int y)
{
    if(rang[x]<rang[y])
        t[x]=y;
    if(rang[x]>rang[y])
        t[y]=x;
    if(rang[x]==rang[y])
    {
        t[x]=y;
        rang[y]++;
    }
}
void kruskal()
{
    for(int i=1;i<=m;i++)
    {
        int tata_x=cauta(v[i].x);
        int tata_y=cauta(v[i].y);

        if(tata_x!=tata_y)
        {
            unire(tata_x,tata_y);
            p[++k].first=v[i].x;
            p[k].second=v[i].y;
            total=total+v[i].cost;
        }
    }
}
void afisare()
{
    g<<total<<endl<<k<<endl;
    for(int i=1;i<=k;i++)
        g<<p[i].second<<" "<<p[i].first<<endl;
}
int main()
{
    citire();
    kruskal();
    afisare();
}