Pagini recente » Cod sursa (job #747525) | Cod sursa (job #2555186) | Cod sursa (job #1978651) | Cod sursa (job #2588012) | Cod sursa (job #2314878)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
vector<pair<int,int>> V[15002];
vector<int> v[15002];
int k,cst[15002],a[30002],l[30002],lg[30002],f[15002],r[30002][15],pr[15002];
priority_queue<pair<int,int>> h;
int owo[15002][30],OwO[15002][30];
void dfs(int nr,int lv)
{
a[++k]=nr;
l[k]=lv;
f[nr]=k;
for(auto it:v[nr])
{
dfs(it,lv+1);
a[++k]=nr;
l[k]=lv;
owo[it][0]=nr;
OwO[it][0]=cst[it];
}
}
int cmax(int nr,int d)
{
int mx=-(1<<29),i;
for(i=25;i>=0;i--)
if((1<<i)<=d)
{
d-=(1<<i);
mx=max(mx,OwO[nr][i]);
nr=owo[nr][i];
}
return mx;
}
int main()
{
int n,m,t,i,j,nr,nr1,nr2;
in>>n>>m>>t;
while(m--)
{
in>>nr1>>nr2>>nr;
V[nr1].push_back({nr,nr2});
V[nr2].push_back({nr,nr1});
}
h.push({0,1});
pr[1]=-1;
while(!h.empty())
{
nr1=h.top().y;nr2=-h.top().x;
pr[nr1]=-pr[nr1];
for(auto it:V[nr1])
if(pr[it.y]==0||(pr[it.y]<0&&cst[it.y]>it.x))
{
cst[it.y]=it.x;
pr[it.y]=-nr1;
h.push({-it.x,it.y});
}
while(!h.empty()&&pr[h.top().y]>0)
h.pop();
}
for(i=2;i<=n;i++)
v[pr[i]].push_back(i);
dfs(1,0);
for(i=2;i<=k;i++)
lg[i]=lg[i/2]+1,r[i][0]=i;
r[1][0]=1;
for(j=0;j<=lg[k];j++)
for(i=0;i+(1<<j)<=k;i++)
if(l[r[i][j]]>l[r[i+(1<<j)][j]])
r[i][j+1]=r[i+(1<<j)][j];
else
r[i][j+1]=r[i][j];
OwO[0][0]=OwO[1][0]=-(1<<29);
for(j=1;j<26;j++)
for(i=1;i<=n;i++)
{
owo[i][j]=owo[owo[i][j-1]][j-1];
OwO[i][j]=max(OwO[i][j-1],OwO[owo[i][j-1]][j-1]);
}
while(t--)
{
in>>nr1>>nr2;
if(nr1==nr2)
{
out<<"0\n";
continue;
}
i=f[nr1];j=f[nr2];
if(i>j)
swap(i,j);
nr=lg[j-i+1];
nr=min(l[r[i][nr]],l[r[j-(1<<nr)+1][nr]]);
out<<max(cmax(nr1,l[f[nr1]]-nr),cmax(nr2,l[f[nr2]]-nr))<<"\n";
}
return 0;
}