Cod sursa(job #3193577)

Utilizator tudorp_Pop Tudor tudorp_ Data 14 ianuarie 2024 22:39:02
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

const string file_name = "coborare";
ifstream fin("apm.in");
ofstream fout("apm.out");


const int NMAX = 100000;
const int Mod = 100003;
int T[NMAX];
int rang[NMAX];
int C[NMAX];

vector<int> G[NMAX];
struct Muchie{
    int x,y,cost;
}Muchii[NMAX];
int cmin;



int find_rep(int k)
{
    if(T[k]!=k)
    {
        int x = find_rep(T[k]);
        T[k] = x;
        return x;
    }
    return k;
}

void Union(int rp, int rk)
{
    if(rk!=rp)
    {
        if(rang[rk]>rang[rp])
        {
            T[rp] = rk;
        }
        else
        {
            T[rk]=rp; //rp e tatal lui rk
            if(rang[rk]==rang[rp])
                rang[rp]++; //rangul = gradul tatalui creste cu 1
        }
    }
}

//Dijkstra - bfs pentru cel mai mic drum de la un nod selectat la toate celelalte noduri, adaugam in PQ nodul cu - pt. sortare -> min heap //
//Kruskal

vector<Muchie> apm;

void citire()
{
    fin>>N>>M;
    for(int i=1;i<=M;i++)
    {
        fin>>Muchii[i].x>>Muchii[i].y>>Muchii[i].cost;
    }
}


int N,M,i,op;


int main()
{
    fin>>N>>M;
    int x,y;
    citire();
      for(i=1;i<=N;i++)
    {
        T[i] = i;
        rang[i] = 1;
    }
    sort(Muchii+1,Muchii+1+M);
    int nr_muchii = 0;
    for(int i=0; i<m && nr_muchii < n-1; i++)
    {
        int repr_x = find_rep(Muchii[i].x);
        int repr_y = find_rep(Muchii[i].y);

        if(repr_x != repr_y) //verificam daca 2 reprezentanti nu sunt uniti
        {
            nr_muchii++; //adaugam la nr de muchii
            cmin+=Muchii[i].c; //adaugam costul Muchiei i la total
            apm.push_back(Muchii[i]); //adaugam muchia in APM
            Union(repr_y, repr_x); //unim arborii reprezentantilor
        }
    }
    fout<<cmin<<'\n';
    fout<<nr_muchii<<'\n';

    for(Muchie edge: apm)
    {
        fout<<edge.x<<" "<<edge.y<<" "<<edge.cost<<'\n';
    }

}