Cod sursa(job #2578844)

Utilizator MihaiB729Bucur Mihai MihaiB729 Data 11 martie 2020 17:15:04
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("oracol.in");
ofstream fout("oraco.out");
const int NMAX=500505;
int t[1001],rang[1001];
struct muchie
{
    int x,y,c;
} v[NMAX];
int n,C,nrm,ri,rj,nr;
long long int costmin;
bool ok(muchie x,muchie y)
{
    return x.c<y.c;
}
int radacina(int k)
{
   // fout<<k<<" "<<t[k]<<endl;
    if(t[k]==0)
        return k;
    else
    {
        nr=radacina(t[k]);
        t[k]=nr;
        return nr;
    }
}
void kruskal()
{
    int j=0;
    for(int i=1; i<=n; i++)
    {
        do
        {
            j++;
            //fout<<v[j].x<<" "<<v[j].y<<" "<<ri<<" "<<rj<<endl;
            ri=radacina(v[j].x);
            //fout<<endl;
            rj=radacina(v[j].y);
            //fout<<endl;
            //fout<<v[j].x<<" "<<v[j].y<<" "<<ri<<" "<<rj<<endl;
        }
        while(v[j].x!=v[j].y && ri==rj);
        costmin+=v[j].c;
        if(v[j].x!=v[j].y)
        {
            if(rang[ri]>rang[rj])
                t[rj]=ri;
            else
            {
                t[ri]=rj;
                if(rang[ri]==rang[rj])
                    rang[rj]++;
            }
        }
    }
}
int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)
        for(int j=i; j<=n; j++)
        {
            fin>>C;
            nrm++;
            v[nrm].c=C;
            v[nrm].x=i;
            v[nrm].y=j+1;
        }
    sort(v+1,v+nrm+1,ok);
    kruskal();
    fout<<costmin;
    return 0;
}