Cod sursa(job #2399055)

Utilizator AndrulianDin Iulian Andrulian Data 6 aprilie 2019 20:00:20
Problema Arbore partial de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int Nmax=400000;
struct muchie
{
    int x,y,c;
};
muchie v[Nmax+5];
muchie sol[(Nmax>>1)+5];
void Interclasare(int p,int u,int m)
{
    int i,j,k=0;
    muchie a[u-p+1]={0};
    i=p;
    j=m+1;
    while(i<=m && j<=u)
    {
        if(v[i].c>v[j].c)
            a[++k]=v[j],j++;
        else
            a[++k]=v[i],i++;
    }
    if(i<=m)
        while(i<=m)
                a[++k]=v[i],i++;
    if(j<=u)
        while(j<=u)
           a[++k]=v[j],j++;
    for(int i=1; i<=k; i++)
        v[p+i-1]=a[i];
}
void Divide(int p,int u)
{
    int m;
    if(u<=p+1)
    {
        ///daca avem cel putin 2 elemente in bucatica creata
        if(v[p].c>v[u].c)
            swap(v[p],v[u]);
    }
    else
    {
        m=(p+u)/2;
        Divide(p,m);
        Divide(m+1,u);
        Interclasare(p,u,m);
    }
}
int main()
{
    int arb[(Nmax>>1)+5]= {0},n,m;
    fin>>n>>m;
    int nr=0;
    while(m--)
    {
        nr++;
        fin>>v[nr].x>>v[nr].y>>v[nr].c;
    }
    Divide(1,nr);
    //for(int i=1; i<=nr; i++)
       // cout<<v[i].x<<" "<<v[i].y<<" "<<v[i].c<<"\n";
    for(int i=1; i<=n; i++)
        arb[i]=i;
    int nrsel=0;
    int  k=1,cost=0;
    do
    {
        // if(nrsel==n-1)break;
        if(arb[v[k].x]!=arb[v[k].y])
        {
            int c,b;
            nrsel++;
            cost+=v[k].c;
            sol[nrsel].x=v[k].x;
            sol[nrsel].y=v[k].y;
            c=max(arb[v[k].x],arb[v[k].y]);
            b=min(arb[v[k].x],arb[v[k].y]);
            for(int j=1; j<=n; j++)
                if(arb[j]==b)
                    arb[j]=c;
        }
        k++;
    }
    while(nrsel!=n-1);
    fout<<cost<<"\n"<<nrsel<<"\n";
    for(int i=1; i<=nrsel; i++)
        fout<<sol[i].x<<" "<<sol[i].y<<"\n";
}