Cod sursa(job #1787034)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 24 octombrie 2016 01:57:53
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;

const int SPQR = 15005;

struct EDGE {
    int u, v, c;

    bool operator < (const EDGE &arg) const {
        return c < arg.c; } };


int uf_far[SPQR], uf_siz[SPQR], lvl[SPQR];
vector<EDGE> g[SPQR], apm[SPQR], edgs;
pair<int, int> far[SPQR];

void join(int a, int b) {
    while(uf_far[a]) a = uf_far[a];
    while(uf_far[b]) b = uf_far[b];

    if(uf_siz[a] < uf_siz[b]) {
        uf_far[b] = uf_far[a];
        uf_siz[b]+= uf_siz[a]; }
    else {
        uf_far[a] = uf_far[b];
        uf_siz[a]+= uf_siz[b]; } }

bool same(int a, int b) {
    while(uf_far[a]) a = uf_far[a];
    while(uf_far[b]) b = uf_far[b];

    return a == b; }

void dfs(int u) {
    for(auto v: apm[u]) if(!lvl[v.v]) {
        lvl[v.v] = lvl[u] + 1;
        far[v.v] = make_pair(u, v.c);
        dfs(v.v); } }

void make_apm(void) {
    sort(edgs.begin(), edgs.end());

    for(auto i: edgs) {
        if(!same(i.u, i.v)) {
            join(i.u, i.v);
            apm[i.u].push_back({i.u, i.v, i.c});
            apm[i.v].push_back({i.v, i.u, i.c}); } } }

int main(void) {
    ifstream fi("radiatie.in");
    ofstream fo("radiatie.out");
    int n, m, q, x, y, c, r;

    for(int i=1; i<SPQR; ++i)
        uf_siz[i] = 1;

    fi >> n >> m >> q;

    edgs.resize(m);
    for(auto &i: edgs) {
        fi >> x >> y >> c;
        g[x].push_back({x, y, c});
        g[y].push_back({y, x, c});
        i = {x, y, c}; }

    lvl[1] = 1;

    make_apm();
    dfs(1);

    while(q--) {
        r = 0;

        fi >> x >> y;
        while(lvl[x] != lvl[y]) {
            if(lvl[x] > lvl[y]) {
                r = max(far[x].second, r);
                x = far[x].first; }
            else {
                r = max(far[y].second, r);
                y = far[y].first; } }

        fo << r << '\n'; }

    return 0; }