Cod sursa(job #2394478)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 1 aprilie 2019 17:35:42
Problema Radiatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.93 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];
//bool uz[NMAX];
int d[NMAX];
int nivmax;


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();
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;
  int x,y;
  int tatut,tatuta;
  int nivinitx,nivinity;
  int nivx;
  int nivy;
  int cact=0;
  for(i=1;i<=k;i++)
    {
     fin>>x>>y;
     nivinitx=nivx=niv[x];
     nivinity=nivy=niv[y];
     cact=0;
     if(nivx>niv[y]) ///il mut mai sus
        {tatut=tatan[x];
         while(nivx!=nivy)
            {
             nivx--;
             cact=max(cact,cost[x]-cost[tatut]);
             x=tatut;
             tatut =tatan[x];
            }
        }
        else
        {tatut=tatan[y];
         while(nivx!=nivy)
            {
             nivy--;

             cact=max(cact,cost[y]-cost[tatut]);
             y=tatut;
             tatut =tatan[y];
            }
        }
     while(x!=y)
        {
         tatut=tatan[x];tatuta=tatan[y];
        cact=max(cact,cost[x]-cost[tatut]);

         cact=max(cact,cost[y]-cost[tatuta]);
         x=tatut;tatut=tatan[x];

         y=tatuta;tatuta=tatan[y];

        }

     fout<<cact<<'\n';
    }
}