Cod sursa(job #1666635)

Utilizator akaprosAna Kapros akapros Data 28 martie 2016 11:08:54
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.28 kb
#include <bits/stdc++.h>
#define maxN 15002
#define maxP 14
using namespace std;
int r, n, m, k, lev[maxN], t[maxN];
int xlca, ylca;
struct asdf
{
    int anc, val;
}v[maxN][maxP + 2];
struct edge
{
    int x;
    int y;
    int z;
};
vector < edge > V;
vector < int > E[maxN];
int cmp(const edge a, const edge b)
{
    return a.z > b.z;
}
int root(int x)
{
    if (t[x] == 0)
        return x;
    t[x] = root(t[x]);
    return t[x];
}
void Union(int x, int y)
{
    int rx = root(x), ry = root(y);
    t[rx] = ry;
}
void read()
{
    int i;
    edge el;
    freopen("radiatie.in", "r", stdin);
    scanf("%d %d %d", &n, &m, &k);
    for (i = 1; i <= m; ++ i)
    {
        scanf("%d %d %d", &el.x, &el.y, &el.z);
        V.push_back(el);
    }
}
void APM()
{
    int rx, ry;
    sort(V.begin(), V.end(), cmp);
    while (m --)
    {
        edge el = V.back();
        rx = root(el.x);
        ry = root(el.y);
        if (rx != ry)
        {
            Union(el.x, el.y);

            if (v[el.x][0].anc)
                swap(el.x, el.y);
            v[el.x][0].anc = el.y;
            v[el.x][0].val = el.z;
            E[el.y].push_back(el.x);
        }
        V.pop_back();
    }
}
void DFS(int x)
{
    int i;
    for (i = 0; i < E[x].size(); ++ i)
    {
        lev[E[x][i]] = lev[x] + 1;
        DFS(E[x][i]);
    }
}
void ANC()
{
    int i, j;
    for (i = 1; i <= n; ++ i)
        if (!v[i][0].anc)
    {
        r = i;
        break;
    }
    DFS(r);
    for (i = 1; i <= n; ++ i)
        for (j = 1; (1 << j) <= n; ++ j)
    {
        v[i][j].anc = v[v[i][j - 1].anc][j - 1].anc;
        v[i][j].val = max(v[i][j - 1].val, v[v[i][j - 1].anc][j - 1].val);
    }
}
int X_anc(int q, int x, int &z)
{
    int i;
    for (i = 0; 1 << i <= x; ++ i)
            if (x & (1 << i))
                {
                    z = max(z, v[q][i].val);
                    q = v[q][i].anc;
                    if (q == 0)
                        break;
                }
    return q;
}
int bs(int x, int y)
{
    int i, k = 0;
    for (i = maxP; i >= 0; -- i)
    {
        int fx = v[x][i].anc,
            fy = v[y][i].anc;
            if (fx != fy)
            {
                xlca = max(xlca, v[x][i].val);
                ylca = max(ylca, v[y][i].val);
                x = fx;
                y = fy;
                k += (1 << i);
            }

    }
    for (i = 0; i <= maxP; ++ i)
    {
        int fx = v[x][i].anc,
            fy = v[y][i].anc;
        if (fx == fy)
        {
            xlca = max(xlca, v[x][i].val);
                ylca = max(ylca, v[y][i].val);
            k += (1 << i);
            break;
        }
    }
    return k;
}
int LCA(int x, int y)
{
    if (lev[x] > lev[y])
        swap(x, y);
    if (lev[y] > lev[x])
        y = X_anc(y, lev[y] - lev[x], ylca);
    return bs(x, y);
}
void solve()
{
    APM();
    ANC();
}
void write()
{
    int x, y, ans;
    freopen("radiatie.out", "w", stdout);
    while (k --)
    {
        scanf("%d %d", &x, &y);
        xlca = 0;
        ylca = 0;
        int lca = LCA(x, y);
        ans = max(xlca, ylca);
        printf("%d\n", ans);
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}