Cod sursa(job #1666937)

Utilizator akaprosAna Kapros akapros Data 28 martie 2016 15:10:22
Problema Radiatie Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.32 kb
#include <bits/stdc++.h>
#define maxN 15002
#define maxP 14
#define f first
#define s second
#define mp make_pair
using namespace std;
int r, n, m, k, lev[maxN], t[maxN * 2];
int xylca;
struct asdf
{
    int anc, val;
} v[maxN][maxP + 2];
struct edge
{
    int x;
    int y;
    int z;
}V[maxN];

vector < pair < int, 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);
    if (rx != ry)
    t[rx] = ry;
}
void read()
{
    int i;
    freopen("radiatie.in", "r", stdin);
    scanf("%d %d %d", &n, &m, &k);
    for (i = 1; i <= m; ++ i)
    scanf("%d %d %d", &V[i].x, &V[i].y, &V[i].z);
}
void APM()
{
    int rx, ry, i;

    sort(V + 1, V + m + 1, cmp);

    for(i = 1; i <= m; i ++)
    {
        rx = root(V[i].x);
        ry = root(V[i].y);
        if(rx != ry){
            Union(rx, ry);
            if (v[V[i].x][0].anc)
                swap(V[i].x, V[i].y);

            E[V[i].x].push_back(mp(V[i].y, V[i].z));
            E[V[i].y].push_back(mp(V[i].x, V[i].z));
        }
    }

}
void DFS(int x)
{
    int i;
    for (i = 0; i < E[x].size(); ++ i)
        if (!lev[E[x][i].f] && E[x][i].f != r)
        {
            lev[E[x][i].f] = lev[x] + 1;
            v[E[x][i].f][0].anc = x;
            v[E[x][i].f][0].val = E[x][i].s;
            DFS(E[x][i].f);
        }
}
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 i;
    for (i = 0; (1 << i) <= x; ++ i)
        if (x & (1 << i))
        {
            xylca = max(xylca, 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;
    if (x == y)
        return x;
    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)
            {
                xylca = max(xylca, v[x][i].val);
                xylca = max(xylca, v[y][i].val);
                x = fx;
                y = fy;
                k += (1 << i);
            }
        }
    if(x != y)
    {
        xylca = max(xylca, v[x][0].val);
        xylca = max(xylca, v[y][0].val);
        ++ k;
    }

    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]);
    return bs(x, y);
}
void solve()
{
    APM();
    ANC();
}
void write()
{
    int x, y, i;
    freopen("radiatie.out", "w", stdout);
    while (k --)
    {
        scanf("%d %d", &x, &y);
        xylca = 0;

        int lca = LCA(x, y);

        if (x == y)
            xylca = 0;

        printf("%d\n", xylca);
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}