Pagini recente » Cod sursa (job #2555003) | Cod sursa (job #2516140) | Cod sursa (job #2180921) | Cod sursa (job #2864586) | Cod sursa (job #2394497)
#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;
int pd[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();
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';
}
}