Pagini recente » Cod sursa (job #1178731) | Cod sursa (job #2046144) | Cod sursa (job #2901139) | Cod sursa (job #2691116) | Cod sursa (job #3327185)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct muchie{
int a, b, c;
}l[30002];
bool comp(muchie a, muchie b){
return a.c<b.c;
}
const int NMAX=15e3+5, EMAX=17;
int n, m, k, ans=0;
int p[NMAX], lvl[NMAX], anc[EMAX][NMAX], maxl[EMAX][NMAX], lg[NMAX];
vector <pair <int,int>> g[NMAX];
int find_parent(int x){
if(p[x]==x) return x;
return p[x]=find_parent(p[x]);
}
void dfs(int nod, int h){
lvl[nod]=h;
for(auto vec : g[nod]){
if(vec.first!=anc[0][nod]){
anc[0][vec.first]=nod;
maxl[0][vec.first]=vec.second;
dfs(vec.first, h+1);
}
}
}
int par(int nod, int ord){
int e=0;
while(ord){
if(ord%2){
ans=max(ans, maxl[e][nod]);
nod=anc[e][nod];
}
ord/=2;
e++;
}
return nod;
}
void lca(int x, int y){
int e=lg[lvl[x]];
while(e>=0){
if(anc[e][x]!=anc[e][y]){
ans=max(ans, maxl[e][x]);
ans=max(ans, maxl[e][y]);
x=anc[e][x];
y=anc[e][y];
//cout<<e<<' '<<x<<' '<<y<<' '<<ans;
}
e--;
}
ans=max(ans, maxl[0][x]);
ans=max(ans, maxl[0][y]);
}
int main(){
fin>>n>>m>>k;
for(int i=0;i<m;i++)
fin>>l[i].a>>l[i].b>>l[i].c;
sort(l, l+m, comp);
//kruskal
for(int i=1;i<=n;i++){
p[i]=i;
}
for(int i=0;i<m;i++){
int px=find_parent(l[i].a), py=find_parent(l[i].b);
if(px!=py){
p[py]=px;
g[l[i].a].push_back({l[i].b, l[i].c});
g[l[i].b].push_back({l[i].a, l[i].c});
}
}
/*for(int i=1;i<=n;i++){
cout<<i<<endl;
for(auto vec : g[i]){
cout<<vec.first<<' ';
}
cout<<endl;
}*/
dfs(1, 1);
for(int i=1;i<=n;i++){
lg[i]=lg[i/2]+1;
//cout<<i<<' '<<anc[0][i]<<' '<<maxl[0][i]<<endl;
}
for(int e=1; e<=lg[n];e++){
//cout<<e<<endl;
for(int i=1;i<=n;i++){
anc[e][i]=anc[e-1][anc[e-1][i]];
maxl[e][i]=max(maxl[e-1][i], maxl[e-1][anc[e-1][i]]);
//cout<<i<<' '<<anc[e][i]<<' '<<maxl[e][i]<<endl;
}
}
while(k--){
int x, y;
ans=0;
fin>>x>>y;
if(lvl[x]>lvl[y])
swap(x, y);
y=par(y, lvl[y]-lvl[x]);
//cout<<x<<' '<<lvl[x]<<' '<<y<<' '<<lvl[y]<<endl;
if(x==y){
fout<<ans<<'\n';
}
else{
lca(x, y);
fout<<ans<<'\n';
}
}
return 0;
}