Pagini recente » Cod sursa (job #2928524) | Cod sursa (job #3243385) | Cod sursa (job #3236178) | Cod sursa (job #3157141) | Cod sursa (job #3040908)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n,m,k;
const int N=15005;
struct muc
{
int x,y,cost;
}edge[2*N];
int tt[N],sz[N];
bool cmp(muc X,muc Y)
{
return X.cost<Y.cost;
}
int get_root(int x)
{
if(tt[x]==x)
return x;
return tt[x]=get_root(tt[x]);
}
void unite(int x,int y)
{
if(sz[x]<sz[y])
swap(x,y);
sz[x]+=sz[y];
tt[y]=x;
}
struct pct
{
int x,y;
};
vector<pct>a[N];
int niv[N];
int rmq_mx[18][N];
int rmq_dad[18][N];
void dfs(int nod,int tt)
{
niv[nod]=niv[tt]+1;
for(int i=1;i<=16;i++)
{
rmq_dad[i][nod]=rmq_dad[i-1][rmq_dad[i-1][nod]];
rmq_mx[i][nod]=max(rmq_mx[i-1][nod],rmq_mx[i-1][rmq_dad[i-1][nod]]);
if(!rmq_dad[i][nod])
break;
}
for(auto x:a[nod])
{
if(x.x==tt)
continue;
rmq_dad[0][x.x]=nod;
rmq_mx[0][x.x]=x.y;
dfs(x.x,nod);
}
}
int solve_lca(int x,int y)
{
if(niv[x]<niv[y])
swap(x,y);
int D=niv[x]-niv[y];
int MX=0;
for(int i=16;i>=0;i--)
if((1<<i)&D)
{
MX=max(MX,rmq_mx[i][x]);
x=rmq_dad[i][x];
}
if(x==y)
return MX;
for(int i=16;i>=0;i--)
{
if(rmq_dad[i][x]!=rmq_dad[i][y])
{
x=rmq_dad[i][x];
y=rmq_dad[i][y];
MX=max(MX,max(rmq_mx[i][x],rmq_mx[i][y]));
}
}
MX=max(MX,rmq_mx[0][x]);
MX=max(MX,rmq_mx[0][y]);
return MX;
}
int main()
{
f>>n>>m>>k;
for(int i=1;i<=m;i++)
f>>edge[i].x>>edge[i].y>>edge[i].cost;
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=n;i++)
tt[i]=i,sz[i]=1;
for(int i=1;i<=m;i++)
{
int X=get_root(edge[i].x);
int Y=get_root(edge[i].y);
if(X!=Y)
{
unite(X,Y);
a[edge[i].x].push_back({edge[i].y,edge[i].cost});
a[edge[i].y].push_back({edge[i].x,edge[i].cost});
if(sz[get_root(1)]==n)
break;
}
}
dfs(1,0);
while(k--)
{
int x,y;
f>>x>>y;
g<<solve_lca(x,y)<<'\n';
}
return 0;
}