Pagini recente » Istoria paginii runda/pregatire_oji_11-12_4/clasament | Cod sursa (job #1297514) | Cod sursa (job #2296927) | Istoria paginii runda/sim_oji | Cod sursa (job #2011776)
#include <bits/stdc++.h>
using namespace std;
const int N=15003;
int n,m,k;
vector<vector<int>>edges;
vector<pair<int,int>>g[N];
int dsuft[N],treeft[15][N],mxedge[15][N],viz[N],dep[N];
int get(int x) {
if(x==dsuft[x])return x;
return dsuft[x]=get(dsuft[x]);
}
void join(int a,int b, int c) {
dsuft[get(a)] = get(b);
g[a].emplace_back(b, c);
g[b].emplace_back(a, c);
}
void dfs(int nod) {
if(treeft[0][nod]==0)dep[nod]=1;
else dep[nod]=dep[treeft[0][nod]]+1;
for(int i=1; i<=14; ++i) {
treeft[i][nod]=treeft[i-1][treeft[i-1][nod]];
mxedge[i][nod]=max(mxedge[i-1][nod],mxedge[i-1][treeft[i-1][nod]]);
}
viz[nod]=1;
for(auto itr:g[nod]) {
if(itr.first==treeft[0][nod])continue;
treeft[0][itr.first]=nod;
mxedge[0][itr.first]=itr.second;
dfs(itr.first);
}
}
void initdsu(int len) {
for(int i=1; i<=len; ++i)dsuft[i]=i;
}
int qry(int a,int b) {
if(dep[a]<dep[b])swap(a,b);
int mx=0;
for(int i=14; i>=0; --i) {
if(dep[a]-(1<<i)>=dep[b]) {
mx=max(mx,mxedge[i][a]);
a=treeft[i][a];
}
}
if(a==b)return mx;
for(int i=14; i>=0; --i) {
if(treeft[i][a]&&treeft[i][b]&&
treeft[i][a]!=treeft[i][b]) {
mx = max(mx, mxedge[i][a]);
mx = max(mx, mxedge[i][b]);
a = treeft[i][a];
b = treeft[i][b];
}
}
mx = max(mx, mxedge[0][a]); mx = max(mx, mxedge[0][b]);
return mx;
}
int main() {
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
cin>>n>>m>>k;
initdsu(n);
edges.resize(m);
for(int i=0; i<m; ++i) {
edges[i].resize(3);
cin>>edges[i][1]>>edges[i][2]>>edges[i][0];
}
sort(edges.begin(),edges.end());
for(auto itr:edges) {
if(get(itr[1])!=get(itr[2]))join(itr[1],itr[2],itr[0]);
}
for(int i=1; i<=n; ++i)if(!viz[i])dfs(i);
for(int i=1; i<=k; ++i) {
int a,b;
cin>>a>>b;
cout<<qry(a,b)<<'\n';
}
return 0;
}