Pagini recente » Cod sursa (job #1798812) | Cod sursa (job #2029201) | Cod sursa (job #1187515) | Cod sursa (job #2207798) | Cod sursa (job #3281728)
#include<bits/stdc++.h>
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
struct radi {
int x,y,c;
}v[30005];
int n,m,t1,x,y,t[20001],h[20001],d[20001],b[20001],p;
vector<int> a[20001];
bool f[20001];
bool comp(radi a, radi b) {
return a.c<b.c;
}
int rad(int x) {
while(x!=t[x])
x=t[x];
return x;
}
void unif(int x, int y, int c) {
int r1=rad(x),r2=rad(y);
if(h[r1]<h[r2]) swap(r1,r2);
t[r2]=r1,h[r1]+=h[r2];
d[r2]=c;
a[r1].push_back(r2);
p=r1;
}
void dfs(int k, int x) {
f[k]=1,b[k]=x;
for(int i=0;i<a[k].size();++i)
if(!f[a[k][i]]) dfs(a[k][i],x+1);
}
int lca(int x, int y) {
int mx1=-1,mx2=-1;
if(b[x]<b[y]) swap(x,y);
while(b[x]!=b[y])
mx1=max(mx1,d[x]),x=t[x];
while(x!=y) {
mx1=max(mx1,d[x]),x=t[x];
mx2=max(mx2,d[y]),y=t[y];
}
return max(mx1,mx2);
}
int main()
{in>>n>>m>>t1;
for(int i=1;i<=n;++i)
t[i]=i,h[i]=1;
for(int i=1;i<=m;++i)
in>>v[i].x>>v[i].y>>v[i].c;
sort(v+1,v+m+1,comp);
for(int i=1;i<=m;++i)
if(rad(v[i].x)!=rad(v[i].y)) unif(v[i].x,v[i].y,v[i].c);
dfs(p,1);
for(int i=1;i<=t1;++i)
in>>x>>y,out<<lca(x,y)<<'\n';
return 0;
}