Cod sursa(job #3149087)

Utilizator tudorbeloiuBeloiu Tudor tudorbeloiu Data 6 septembrie 2023 12:54:54
Problema Arbore partial de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int NMax = 400005;

int n,m,x,y,c,tata[NMax],rang[NMax],k=0,Total=0;
pair<int,int> M[NMax];

struct Edge{
    int x,y,c;

}v[NMax];

bool cmp(Edge a, Edge b)
{
    return a.c < b.c;
}

int Find(int nod)
{
    while(tata[nod]!=nod)
        nod=tata[nod];
    return nod;
}

void Unite(int x,int y)
{
    if(rang[x]<rang[y])
        tata[x]=y;
    if(rang[y]<rang[x])
        tata[y]=x;
    if(rang[x]==rang[y])
    {
        tata[x]=y;
        rang[x]++;
    }
}

void Solve()
{
    for(int i=1; i<=m; i++)
    {
        int tatal_x = Find(v[i].x);
        int tatal_y = Find(v[i].y);

        if(tatal_x!=tatal_y)
        {
            Unite(tatal_x,tatal_y);
            M[++k].first = v[i].x;
            M[k].second = v[i].y;
            Total = Total + v[i].c;

        }
    }
}

int main()
{
    f >> n >> m;
    for(int i=1; i<=m; i++)
    {
        f >> v[i].x >> v[i].y >> v[i].c;
    }
    sort(v+1,v+m+1,cmp);

    for(int i=1; i<=m; i++)
    {
        tata[i]=i;
        rang[i]=1;
    }

    Solve();

    g<<Total<<"\n";
    g<<n-1<<"\n";

    for(int i=1; i<=k; i++)
        g<<M[i].first<<" "<<M[i].second<<"\n";


    return 0;
}