Pagini recente » Cod sursa (job #294899) | Cod sursa (job #1745560) | Cod sursa (job #2090291) | Cod sursa (job #1901147) | Cod sursa (job #2433859)
#include <bits/stdc++.h>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
const int NMAX = 15010;
const int LMAX = 15;
int n,m,k,ind[2 * NMAX], link[NMAX], x[NMAX], y[NMAX], c[NMAX], dist[NMAX],size[NMAX];
vector <pair < int,int> > ve[NMAX];
int cost[LMAX][NMAX], dp[LMAX][NMAX];
bool cmp(const int &X, const int &Y){
return c[X] < c[Y];
}
int find(int x){
while(link[x] != x)
x = link[x];
return x;
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (size[y]>size[x])
swap(x,y);
size[x]+=size[y];
link[y] = x;
}
void dfs(int node){
int i;
for(auto it: ve[node])
if(!dist[it.first]){
dist[it.first] = dist[node] + 1;
dfs(it.first);
cost[0][it.first] = it.second;
dp[0][it.first] = node;
}
}
int main(){
int i,j,qx,qy;
f >> n >> m >> k;
for(i = 1 ; i <= m ; i++)
f >> x[i] >> y[i] >> c[i];
for(i = 1 ; i <= m ; i++)
ind[i] = i;
for(i = 1 ; i <= n ; i++)
link[i] = i, size[i] = 1;
sort(ind + 1, ind + m + 1, cmp);
for(i = 1 ; i <= m ; i++){
if(find( x[ind[i]]) != find( y[ind[i]] ) ){
unite(x[ind[i]], y[ind[i]]);
ve[x[ind[i]]].push_back(make_pair(y[ind[i]], c[ind[i]]));
ve[y[ind[i]]].push_back(make_pair(x[ind[i]], c[ind[i]]));
}
}
dfs(1);
for(i = 1 ; (1 << i) <= n ; i++)
for(j = 1 ; j <= n ; j++){
dp[i][j] = dp[i - 1][dp[i - 1][j]];
cost[i][j] = max(cost[i - 1][j], cost[i - 1][dp[i - 1][j]]);
}
for(i = 1 ; i <= k ; i++){
f >> qx >> qy;
if(dist[qx] < dist[qy])
swap(qx, qy);
int l1, l2;
l1 = l2 = 0;
while((1 << l1) < dist[qx])
l1++;
while((1 << l2) < dist[qy])
l2++;
int maxim = 0;
for(j = l1 ; j >= 0 ; j--)
if(dist[qx] - (1 << j) >= dist[qy]){
maxim = max(maxim, cost[j][qx]);
qx = dp[j][qx];
}
if(qx == qy){
g << maxim << "\n";
continue;
}
for(j = l2; j >= 0 ; j--)
if(dist[qx] - (1 << j) >= 0 && dp[j][qx] != dp[j][qy]){
maxim = max(maxim, max(cost[j][qx], cost[j][qy]));
qx = dp[i][qx];
qy = dp[i][qy];
}
maxim = max(maxim, max(cost[0][qx], cost[0][qy]));
g << maxim << "\n";
}
return 0;
}