Cod sursa(job #2394666)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 1 aprilie 2019 19:43:33
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.88 kb
#include <bits/stdc++.h>
#define NMAX 15009
#define LMAX 22
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n,m,k;
int h[NMAX];
int tata[NMAX];
int fatherx,fathery;
int maxim;
//bool uz[NMAX];
int d[NMAX];
int nivmax;
int pdt[NMAX][LMAX];
int pdc[NMAX][2*LMAX];
bool uz[NMAX];
int tatan[NMAX];
int cost[NMAX];
int niv[NMAX];

struct muchie{int x;int y; int c;};
struct arb{int y; int c;};
                                vector <arb>g[NMAX];

 bool operator <(muchie x,muchie y)
{
  return x.c>y.c;
}
priority_queue<muchie>C;

void Union(int x,int y);
void citire();
int Find(int x);
void rez();
void dfs(int k, int lvl);
void lca();
void recus();
int main()
{
 citire();
 dfs(1,1);
 lca();
 //rez();
    return 0;
}
void citire()
{
 int i;
 int x,y,c;
 muchie muc;
 fin>>n>>m>>k;
 for(i=1;i<=m;i++)
    {
     fin>> x>>y>>c;
     muc.x=x;muc.y=y;muc.c=c;
     C.push(muc);
    }
 int ct=0;
 int ctx=0,cty=0;
 arb val;
  for(i=1;i<=m && ct!=n-1;i++)
    {
      muc=C.top();C.pop();
     // fout<<muc.x<<" "<<muc.y<<" "<<muc.c<<'\n';
      x=muc.x;y=muc.y;

      ctx=Find(x);
      cty=Find(y);
      if(ctx!=cty)
         Union(ctx,cty),ct++,g[x].push_back({y,muc.c}),g[y].push_back({x,muc.c});
    }

}
void Union(int x,int y)
{   if(h[x]<h[y])
    tata[x]=y;
    else
    {tata[y]=x;if(h[x]==h[y])h[x]++;}
}
int Find(int x)
{
    int rad=x;int aux;
    while(tata[rad])
        rad=tata[rad];
    while(tata[x])
    {   aux=tata[x];
        tata[x]=rad;
        x=aux;
    }
    return rad;
}

///bool uz[NMAX];
///int tatan[NMAX];
///int cost[NMAX];
///int niv[NMAX];
void dfs(int k, int lvl)
{int i;
 arb elem;
 uz[k]=1; niv[k]=lvl;  if(lvl>nivmax) nivmax=lvl;
 for(i=0;i<g[k].size();i++)
    {
      elem=g[k][i];
        if(!uz[elem.y])
          {
              uz[elem.y]=1;
              tatan[elem.y]=k;
              cost[elem.y]=cost[k]+elem.c;
              dfs(elem.y,lvl+1);
          }
    }

}

void lca()
{int i,j;
 int x,y;
 for(i=1;i<=n;i++)
   {
    pdt[i][0]=tatan[i];
    pdc[i][0]=cost[i]-cost[ tatan[i]];
   }

 for(i=1;i<=n;i++)
     for(j=1;niv[i]-(1<<j)>= 0;j++)
{
        pdt[i][j]=pdt [pdt[i][j-1]] [j-1];
        pdc[i][j]=max(pdc[i][j-1],pdc[pdt[i][j-1] ][j-1]);
}
///gata partea dinamica
int put;
int lg;
 for(i=1;i<=k;i++)
    {
     fin>>x>>y;maxim=-1;
     fatherx=x;fathery=y;
     if(niv[x]>niv[y]) ///aduc pe x la niv lui y
        {
         lg=niv[x]-niv[y];
         while(lg)
            {
             put=   log2(lg);
             lg=lg-(1<<put);
             maxim=max(maxim,pdc[fatherx][put]);
             fatherx=pdt[fatherx][put];

            }

        }
        else ///il aduc pe y la niv lui x
        {
         lg=niv[y]-niv[x];
         while(lg)
            {
             put=   log2(lg);
             lg=lg-(1<<put);
             maxim=max(maxim,pdc[fathery][put]);
             fathery=pdt[fathery][put];

            }

        }
    //fout<<niv[fatherx]<<" "<<niv[fathery]<<" "<<maxim<<'\n';
    recus();

     ///intre j si j-1 se afla rexultatul
     //cautbin()
    fout<<maxim<<'\n';
    }
}
void recus()
{int j;
 bool gasit=0;
 for(j=0;(1<<j)<niv[fatherx];j++)
        {
         if(pdt[fatherx][j]==pdt[fathery][j] && fatherx!=fathery)
            {gasit=1;break;}
            else
            {
             if(pdt[fatherx][j]==pdt[fathery][j])
                    break;
            }
         maxim=max(maxim,pdc[fatherx][j]);

         maxim=max(maxim,pdc[fathery][j]);
        }
     if(!j)
        {
         if(gasit)
         {maxim=max(maxim,pdc[fatherx][0]);
          maxim=max(maxim,pdc[fathery][0]);
         }
        }
        else
        {
          fatherx=pdt[fatherx][j-1];
          fathery=pdt[fathery][j-1];
          recus();
        }
}