Cod sursă (job #748468)

Utilizator avatar AlexandruDrg23 Drăghici Alexandru AlexandruDrg23 IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp-32 | 1,70 kb
Rundă Arhiva de probleme Status evaluat
Dată 1 dec. 2023 09:34:56 Scor 70
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("zapada.in");
ofstream fout("zapada.out");

struct nodi{
    int pr,fi,dis;
};

int n;
vector<nodi> v;
vector<int> vf;
int tot;

int ga(int nod)
{
    if(vf[nod]==nod)
        return nod;
    vf[nod]=ga(vf[nod]);
    return vf[nod];
}

void kruskal()
{
    vector<nodi>::iterator el;
    int alese=0;
    for(el=v.begin();el!=v.end() && alese<n-1;el++)
    {
        if(ga(el->fi)!=ga(el->pr))
        {
            alese++;
            tot=tot+(el->dis);
            vf[vf[el->fi]]=vf[el->pr];
            ga(vf[el->fi]);
        }
    }
}

int caut1;

int caut(int st,int dr)
{
    if(st>=dr)
        return st;
    int mij=(st+dr)>>1;
    if(v[mij].dis>caut1)
        return caut(st,mij-1);
    return caut(mij+1,dr);
}


int main()
{
    int m,K;
    fin>>n>>m>>K;
    nodi nod;
    for(int k=1;k<=m;k++)
    {
        fin>>nod.pr>>nod.fi>>nod.dis;
        v.push_back(nod);
    }
    vf.resize(n+1);
    for(int k=1;k<=n;k++)
        vf[k]=k;
    sort(v.begin(),v.end(),[](nodi a,nodi b){
            return a.dis<b.dis;
         });
    kruskal();
    fout<<tot<<'\n';
    vector<nodi>::iterator poz;
    poz=v.begin();
    int mini=tot;
    for(int k=1;k<=K;k++)
    {
        fin>>nod.pr>>nod.fi>>nod.dis;
        caut1=nod.dis;
        v.insert(v.begin()+caut(0,m-1),nod);
        vector<nodi>::iterator poz1;
        m++;
        n++;
        vf.push_back(0);
        for(int c=1;c<=n;c++)
            vf[c]=c;
        tot=0;
        kruskal();
        mini=min(mini,tot);
        fout<<mini<<'\n';
    }
    return 0;
}