Cod sursa(job #2433859)

Utilizator bluestorm57Vasile T bluestorm57 Data 29 iunie 2019 15:09:44
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#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;
}