Cod sursa(job #2405871)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 15 aprilie 2019 09:05:31
Problema Radiatie Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <bitset>
#include <cmath>

#define N 15005

using namespace std;

int n,m,k,x,y,c;
vector <pair<int,int>> g[N];
vector <pair<int,pair<int,int>>> muchi;
int dp[20][2*N],f[N];
int t[N], ad[N];
pair<int,int> vt[N];
bitset<N> viz;
int sol;

int cauttata(int nod){
    if(t[nod]==0)
        return nod;
    t[nod] = cauttata(t[nod]);
    return t[nod];
}

void dfs(int nod, int niv){
    ad[nod] = niv;
    dp[0][++dp[0][0]] = nod;
    f[nod] = dp[0][0];
    viz[nod]=1;
    for(auto i : g[nod]){
        if(!viz[i.first]){
            vt[i.first] = {nod,i.second};
            dfs(i.first,niv+1);
            dp[0][++dp[0][0]] = nod;
        }
    }
}

void solveLCA(){
    for(int i = 1; (1<<i)<=dp[0][0]; ++i)
        for(int j = 1; j+(1<<(i-1))<dp[0][0]; ++j)
            if(ad[dp[i-1][j]]<ad[dp[i-1][j+(1<<(i-1))]])
                dp[i][j] = dp[i-1][j];
            else
                dp[i][j] = dp[i-1][j+(1<<(i-1))];
}

int lca(int st, int dr){
    if(st>dr)
        swap(st,dr);
    int k2 = log2(dr-st+1);
    if(ad[dp[k2][st]] < ad[dp[k2][dr-(1<<k2)+1]])
        return dp[k2][st];
    else
        return dp[k2][dr-(1<<k2)+1];
}

void solve(int sursa, int dest){
    if(sursa==dest)
        return ;
    sol = max(sol, vt[sursa].second);
    solve(vt[sursa].first, dest);
}

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);

    scanf("%d%d%d", &n,&m,&k);
    for(int i = 0; i < m; ++i){
        scanf("%d%d%d", &x,&y,&c);
        muchi.push_back({c,{x,y}});
    }
    sort(muchi.begin(),muchi.end());
    int muc = 0;
    for(pair<int,pair<int,int>> i : muchi){
        int tx = cauttata(i.second.first), ty = cauttata(i.second.second);
        if(tx!=ty){
            t[tx] = ty;
            g[i.second.first].push_back({i.second.second,i.first});
            g[i.second.second].push_back({i.second.first,i.first});
            ++muc;
        }
        if(muc == n-1)
            break;
    }
    dfs(1,0);
    solveLCA();

    for(int i = 0; i < k; ++i){
        scanf("%d%d", &x,&y);
        int s = lca(f[x],f[y]);
        sol = 0;
        solve(x,s);
        solve(y,s);
        cout<<sol<<"\n";
    }

    return 0;
}