Cod sursa(job #2583973)

Utilizator BotzkiBotzki Botzki Data 18 martie 2020 15:06:52
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("rusoaica.in");
ofstream fout("rusoaica.out");
const int NMAX = 100000;
struct muchie
{
    int nod1, nod2, cost;
    bool operator < (const muchie &a)const{
        return cost<a.cost;
    }
};
vector <muchie> muchii;

int h[NMAX+5], t[NMAX+5]; ///h - vectorul de inaltimi, iar t- vectorul de tati

int FindSet(int x)
{
    int cx=x, aux;
    while(t[x]!=x)
        x=t[x];
    ///Incerc sa optimizez radacina pentru urmatoarele operatii
    ///Cu alte cuvine aici fac compresia drumurilor
   while(cx!=x)
    {
        aux=t[cx];
        t[cx]=x;
        cx=aux;
    }
    return x;

}
void UnionSet(int x, int y)
{
    /// x si y sunt radacinile celor 2 arbori
  if(h[x]==h[y])
  {
      t[x]=y;
      h[y]++;
  }
  else
  {
      if(h[x]>h[y])
          t[y]=x;
      else
        t[x]=y;
  }
}


int main()
{
    int n, m, a, i, u, v, c, tx, ty;
    muchie aux;
    fin>>n>>m>>a;
    for(i=1;i<=n;i++)
    {
       h[i] = 1;
       t[i] = i;
    }
    for(i=1;i<=m;i++)
    {
      fin>>u>>v>>c;
      aux.nod1 = u;
      aux.nod2 = v;
      aux.cost = c;
      muchii.push_back(aux);
    }
    sort(muchii.begin(), muchii.end());
    long long sol = 0;
    int solm =0;
    for(i=0;i<muchii.size();i++)
    {
        aux = muchii[i];
        tx = FindSet(muchii[i].nod1);
        ty = FindSet(muchii[i].nod2);
        if(tx!=ty)
        {
            if(aux.cost <= a)
            {
              sol = sol + aux.cost;
              UnionSet(tx, ty);
              solm++;
            }
            else
            {
              sol = sol + a - aux.cost;
              UnionSet(tx, ty);
              solm++;
            }
        }
        else
            sol = sol - aux.cost;
    }
    if(solm!=(n-1))
    {
       sol = sol + ((n-1) - solm)*a;
    }
    fout<<sol<<"\n";
    return 0;
}