Cod sursa(job #3215924)

Utilizator Alexia_CiobanuAlexia Maria Ciobanu Alexia_Ciobanu Data 15 martie 2024 14:23:31
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#define MMAX 400003
#define NMAX 200003
#include <algorithm>
using namespace std; ///problema infoarena  Arbore partial de cost minim
ifstream fin("apm.in");
ofstream fout("apm.out");

struct muchii {int x,y,c;};
struct raspuns {int x,y;};
int n,m;
muchii G[MMAX];
int t[NMAX],high[NMAX];
raspuns ans[NMAX];
void citire()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>G[i].x>>G[i].y>>G[i].c;
        if(G[i].x>G[i].y) swap(G[i].x,G[i].y);
    }
}
bool cmp (muchii a, muchii b)
{
    return a.c <b.c;
}
int Find(int x)
{
    int radacina=x;
    while(t[radacina]!=radacina)
        radacina=t[radacina];

    while(t[x]!=radacina)
    {
        int aux=t[x];
        t[x]=radacina;
        x=aux;
    }
    return radacina;
}
void Union(int x,int y) ///punem direct radacinile arborilor din care fac parte
{
    if(high[x]<high[y])
        t[x]=y;
    else
    {
        if(high[y]<high[x])
            t[y]=x;
        else
        {
             t[x]=y;
             high[y]++;
        }
    }
}
int main()
{
    citire();
    sort(G+1,G+m+1,cmp);
    ///kruskal
    for(int i=1;i<=n;i++) t[i]=i;
    int i=1,nrmuchii=0,cosmin=0,rx,ry;
    while(nrmuchii<n-1)
    {
        rx=Find(G[i].x); ry=Find(G[i].y);
        if(rx!=ry)
        {
            cosmin+=G[i].c;
            nrmuchii++;
            Union(rx,ry);
            ans[nrmuchii].x=G[i].x;
            ans[nrmuchii].y=G[i].y;
        }
        i++;
    }
    fout<<cosmin<<" "<<nrmuchii;
    for(int i=1;i<=nrmuchii;i++)
        fout<<'\n'<<ans[i].x<<" "<<ans[i].y;
    return 0;
}