Cod sursa(job #3203993)

Utilizator camelia22Dragoiu Camelia camelia22 Data 15 februarie 2024 10:46:36
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define nr 400002
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
struct muchie
{
    int x, y, c;
}v[nr],sol[nr];
int n,m,i,viz[nr/2],cost,rang[nr/2],t[nr/2];
bool ordonare(muchie a, muchie b)
{
    return a.c<b.c;
}
void citire()
{
    f>>n>>m;
    for (i=1;i<=m;i++)
        f>>v[i].x>>v[i].y>>v[i].c;
}
int radacina(int k)
{
    while (t[k]!=k)
        k=t[k];
    return k;
}
void kruskal()
{
    int i=1,k=1,nr1,nr2,j,tatax,tatay;
    int cnt=0;
    for (i=1;i<=n;i++) t[i]=i, rang[i]=1;
    i=1;
    for (i=1;i<=m;i++)
    {
        tatax=radacina(v[i].x);
        tatay=radacina(v[i].y);
        if (tatax!=tatay)
        {
            cost+=v[i].c;
            sol[++cnt].x=v[i].x; sol[cnt].y=v[i].y;
            if (rang[tatax]>rang[tatay])
                t[tatay]=tatax;
            else
            {
                t[tatax]=tatay;
                if (rang[tatax]==rang[tatay])
                rang[tatay]++;
            }
        }
    }
}
void afis()
{
    int i;
    g<<cost<<'\n'<<n-1<<'\n';
    for (i=1;i<=n-1;i++)
        g<<sol[i].x<<" "<<sol[i].y<<'\n';
}
int main()
{
    citire();
    sort(v+1,v+m+1,ordonare);
    ///prim();
    kruskal();
    afis();
    return 0;
}