Cod sursa(job #2548426)

Utilizator rares9991Matisan Rares-Stefan rares9991 Data 16 februarie 2020 17:35:39
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

ifstream in ("apm.in");
ofstream out ("apm.out");

const int N=200005;
const int M=2*N;

int nr[N], t[N]
long long int ctotal;
bool selectat[M];

struct kruskal
{
    int x,y,c;
}v[N], aux;

int radacina(int x)
{
    if(t[x]==0)
        return x;
    t[x]=radacina(t[x]);
    return t[x];
}

void reuniune(int x, int y)
{
    int rx=radacina(x);
    int ry=radacina(y);
    if(rx==ry)
        return;
    if(nr[rx]<nr[ry])
    {
        t[rx]=ry;
        nr[ry]+=nr[rx];
    }
    else
    {
        t[ry]=rx;
        nr[rx]+=nr[ry];
    }
}

bool interogare(int x, int y)
{
    return (radacina(x)==radacina(y));
}

int n, m;

int main()
{
    in>>n>>m;
    for(int i=0; i<m; i++)
        in>>v[i].x>>v[i].y>>v[i].c;
    for(int i=0; i<m; i++)
        for(int j=i+1; j<m; j++)
    {
        if(v[i].c>v[j].c)
        {
            aux=v[i];
            v[i]=v[j];
            v[j]=aux;
        }
    }
    int i=0, nrm=0;
    while(nrm<n-1)
    {
        if(!interogare(v[i].x, v[i].y))
        {
            selectat[i]=true;
            reuniune(v[i].x, v[i].y);
            ctotal+=v[i].c;
            nrm++;
        }
        i++;
    }
    out<<ctotal<<"\n"<<nrm<<"\n";
    for(int i=0; i<m; i++)
        if(selectat[i])
        out<<v[i].y<<" "<<v[i].x<<"\n";
    return 0;
}