Cod sursa(job #2982657)

Utilizator davidbostinaBostina David davidbostina Data 20 februarie 2023 17:57:21
Problema Arbore partial de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
pair < int,int > P[400005];
struct muchie{
    int x,y,cost;
}muchii[400005];

int n,m, tata[200005], rang[200005],total,k;


void citire()
{
    fin>>n>>m;
    int a,b,c;
    for(int i=1;i<=m;i++)
    {
        fin>>muchii[i].x>>muchii[i].y>>muchii[i].cost;
    }
    for(int i=1;i<=n;i++)
    {
        tata[i]=i;
        rang[i]=1;
    }
}

void ordonare()
{
    for(int i=1;i<m;i++)
    {
        for(int j=i+1;j<=m;j++)
        {
            if(muchii[i].cost>muchii[j].cost)
            {
                muchie aux=muchii[i];
                muchii[i]=muchii[j];
                muchii[j]=aux;
            }
        }
    }
}

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

void unire(int nod1, int nod2)
{
    if(rang[nod1]>rang[nod2])
    {
        tata[nod2]=nod1;
    }
    if(rang[nod1]<rang[nod2])
    {
        tata[nod1]=nod2;
    }
    if(rang[nod1]==rang[nod2])
    {
        tata[nod1]=nod2;
        rang[nod2]++;
    }
}

void rezolva()
{
    k=0;
    for(int i=1;i<=m;i++)
    {
        int tata1=gaseste( muchii[i].x );
        int tata2=gaseste(muchii[i].y);
        if( tata1 != tata2)
        {
            unire( gaseste(muchii[i].x ) ,  gaseste(muchii[i].y) );
            k++;
            P[k].first=muchii[i].x;
            P[k].second=muchii[i].y;
            total=total+muchii[i].cost;
        }
    }
}


int main()
{
citire();
ordonare();
rezolva();
fout<<total<<endl;
fout<<k<<endl;
for(int i=1;i<=k;i++)
{
    fout<<P[i].first<<" "<<P[i].second<<endl;
}


return 0;
}