Pagini recente » Cod sursa (job #967693) | Cod sursa (job #587355) | Cod sursa (job #2364490) | Cod sursa (job #1589433) | Cod sursa (job #2394666)
#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();
}
}