Cod sursa(job #3203280)

Utilizator camelia22Dragoiu Camelia camelia22 Data 13 februarie 2024 13:51:47
Problema Arbore partial de cost minim Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 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,l[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;
}
void prim()
{
    cost=v[1].c;///initial,costul este al primei muchii
    int cnt=1;
    viz[v[1].x]=viz[v[1].y]=1;
    sol[1].x=v[1].x; sol[1].y=v[1].y;///prima muchie
    int k, i;
    for (k=1;k<=n-2;k++)
    {
        i=1;
        while (viz[v[i].x]==viz[v[i].y])
            i++;
        sol[++cnt].x=v[i].x; sol[cnt].y=v[i].y;
        cost+=v[i].c;
        if (viz[v[i].x])
            viz[v[i].y]=1;
        else
            viz[v[i].x]=1;
    }
}
void kruskal()
{
    int i=1,k=1,nr1,nr2,j;
    int cnt=0;
    for (i=1;i<=n;i++) l[i]=i;
    i=1;
    while (k<=n-1)
    {
        if (l[v[i].x]!=l[v[i].y])
        {
            k++;
            sol[++cnt].x=v[i].x; sol[cnt].y=v[i].y;
            cost+=v[i].c;
            nr1=l[v[i].x];
            nr2=l[v[i].y];
            for (j=1;j<=n;j++)
                if (l[j]==nr2) l[j]=nr1;
        }
        i++;
    }
}
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;
}