Cod sursa(job #3171586)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 19 noiembrie 2023 02:02:43
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

ifstream fin ( "radiatie.in" );
ofstream fout ( "radiatie.out" );

const int N = 5e4;
int str[N], niv[N];

struct muchie {
    int a;
    int b;
    int cost;
} v[N];

vector <pair <int, int>> g[N];

bool cmp ( muchie a, muchie b ) {
    return a.cost < b.cost;
}

int sup[N];

int suprem ( int x ) {
    if ( x == sup[x] )
        return x;
    else {
        sup[x] = suprem(sup[x]);
        return sup[x];
    }
}

int viz[N], dist[N], rad[N];

void dfs ( int node, int par ) {
    
    str[node] = par;
    niv[node] = niv[par] + 1;
    
    for ( int i = 0; i < g[node].size(); i++ )
        
        if ( g[node][i].first != par ) {
            rad[g[node][i].first] = g[node][i].second;
            dfs ( g[node][i].first, node );
        }
}

int lca ( int x, int y ) {
    
    int ans = 0;
    
    if ( niv[x] < niv[y] )
        swap ( x, y );
    
    while ( niv[x] > niv[y] ) {
        ans = max ( ans, rad[x] );
        x = str[x];
    }
    
    while ( x != y ) {
        ans = max ( ans, max ( rad[x], rad[y]) );
        x = str[x];
        y = str[y];
    }
    
    return ans;
        
}

int main () {
    
    int n, m, q;
    
    fin >> n >> m >> q;
    
    for ( int i = 0; i < m; i++ )
        fin >> v[i].a >> v[i].b >> v[i].cost;
    
    sort ( v, v + n, cmp );
    
    for ( int i = 1; i <= n; i++ )
        sup[i] = i;
    
    for ( int i = 0; i < m; i++ ) {
        
        if ( suprem (v[i].a) != suprem(v[i].b) ) {
            
            sup[suprem(v[i].a)] = suprem(v[i].b);
            
            g[v[i].a].push_back ( {v[i].b, v[i].cost} );
            g[v[i].b].push_back ( {v[i].a, v[i].cost} );
        }
    }
    
    dfs ( 1, 0 );
    
    int x, y;
    for ( int i = 0; i < q; i++ ) {
        
        fin >> x >> y;
        
        fout << lca ( x, y ) << "\n";
        
    }
    
    return 0;
}