Cod sursa(job #1666826)

Utilizator akaprosAna Kapros akapros Data 28 martie 2016 13:40:32
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 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)
        if (!lev[E[x][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 (j = 1; (1 << j) <= n; ++ j)
    for (i = 1; i <= n; ++ i)
        {
            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, X = x, Y = y;
    for (i = maxP; i >= 0; -- i)
        if ((1 << i) <= lev[x])
        {
            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);
            }

        }
    if (x != y)
        for (i = 0; i <= maxP; ++ i)
            if ((1 << i) <= lev[x])
            {
                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);
        if (x != y)
            ans = max(xlca, ylca);
        else
            ans = 0;
        printf("%d\n", ans);
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}