Pagini recente » Cod sursa (job #279202) | Cod sursa (job #807602) | Cod sursa (job #240394) | Cod sursa (job #1419604) | Cod sursa (job #3185541)
#include <bits/stdc++.h>
using namespace std;
const int dim=3e4+5;
vector<pair<int,int>> G[dim];
int n,m,q,t[dim],r[dim],d[dim],dp[20][dim],bl[20][dim],blc[20][dim];
bool viz[dim];
struct muc{
int x,y,c;
}a[3*dim];
bool cmp(muc A, muc B){
return A.c<B.c;
}
int rad(int nod){
if(nod==t[nod]){
return nod;
}
else{
return (t[nod]=rad(t[nod]));
}
}
void uneste(int x, int y){
if(r[x]<r[y]){
t[x]=y;
r[y]+=r[x];
}
else{
t[y]=x;
r[x]+=r[y];
}
}
void bfs(int nod){
queue<int> Q;
Q.push(nod);
viz[nod]=1;
while(!Q.empty()){
int x=Q.front();
Q.pop();
for(auto u:G[x]){
if(!viz[u.first]){
viz[u.first]=1;
Q.push(u.first);
d[u.first]=d[x]+1;
dp[0][u.first]=u.second;
bl[0][u.first]=x;
}
}
}
}
void RMQ(){
for(int k=1;k<=20;k++){
for(int i=1;i<=n;i++){
bl[k][i]=bl[k-1][bl[k-1][i]];
}
}
for(int k=0;k<=20;k++){
for(int i=1;i<=n;i++){
blc[k][i]=bl[k][i];
}
}
for(int k=1;k<=20;k++){
for(int i=1;i<=n;i++){
dp[k][i]=max(dp[k-1][i],dp[k-1][bl[k-1][i]]);
}
}
for(int k=0;k<=20;k++){
for(int i=1;i<=n;i++){
bl[k][i]=blc[k][i];
}
}
}
int lca_max(int x, int y){
int sol=0;
if(d[x]<d[y]){
swap(x,y);
}
for(int k=20;k>=0;k--){
if(d[x]-(1<<k)>=d[y]){
sol=max(sol,dp[k][x]);
x=bl[k][x];
}
}
if(x==y){
return sol;
}
for(int k=20;k>=0;k--){
if(bl[k][x] and bl[k][x]!=bl[k][y]){
sol=max(sol,max(dp[k][x],dp[k][y]));
x=bl[k][x];
y=bl[k][y];
}
}
return sol;
}
int main(){
ifstream f("radiatie.in");
ofstream g("radiatie.out");
f>>n>>m>>q;
for(int i=1;i<=n;i++){
t[i]=i;
r[i]=1;
}
for(int i=1;i<=m;i++){
f>>a[i].x>>a[i].y>>a[i].c;
}
sort(a+1,a+m+1,cmp);
int s=0;
for(int i=1;i<=m;i++){
int r1=rad(a[i].x),r2=rad(a[i].y);
if(r1!=r2){
s+=a[i].c;
uneste(r1,r2);
G[a[i].x].push_back({a[i].y,a[i].c});
G[a[i].y].push_back({a[i].x,a[i].c});
}
}
bfs(1);
RMQ();
while(q--){
int x,y;
f>>x>>y;
g<<lca_max(x,y)<<'\n';
}
return 0;
}