Cod sursa(job #1713370)

Utilizator antanaAntonia Boca antana Data 5 iunie 2016 13:57:16
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <cstdio>
#include<algorithm>
#define MAXN 15000
#define MAXM 30000
#define LOG 15
using namespace std;
struct muchie{
    int val, cost;
}v[2*MAXN+1];
struct muchie1{
    int x, y, cost;
}grf[MAXM+1];
int r, lista[MAXN+1], nxt[2*MAXN+1], h[MAXN+1], str[LOG][MAXN+1], maxi[LOG][MAXN+1], t[MAXN+1], viz[MAXN+1];
inline void swap1(int &a, int &b)
{
    int aux=a;
    a=b;
    b=aux;
}
inline void adauga(int x, int y, int z)
{
    v[++r].val=y;
    v[r].cost=z;
    nxt[r]=lista[x];
    lista[x]=r;
}
inline int maxim(int a, int b)
{
    if(a>b)
        return a;
    return b;
}
bool cresc(const muchie1 &a, const muchie1 &b)
{
    return (a.cost<b.cost);
}
int father(int x)
{
    if(x==t[x])
        return x;
    return t[x]=father(t[x]);
}
inline void join(int x, int y)
{
    int rx=father(x), ry=father(y);
    t[rx]=ry;
}
void dfs(int nod)
{
    int p, vecin;
    p=lista[nod];
    viz[nod]=1;
    while(p)
    {
        vecin=v[p].val;
        if(!viz[vecin]){
            str[0][v[p].val]=nod;
            maxi[0][v[p].val]=v[p].cost;
            h[vecin]=h[nod]+1;
            dfs(v[p].val);
        }
        p=nxt[p];
    }
}
void calculate(int n)
{
    for(int j=1;(1<<j)<=n;++j)
        for(int i=1;i<=n;++i){
            str[j][i]=str[j-1][str[j-1][i]];
            maxi[j][i]=maxim(maxi[j-1][i], maxi[j-1][str[j-1][i]]);
        }
}
inline int query(int x, int y)
{
    int mx=-1;
    if(h[x]<h[y])
        swap1(x, y);

    int log1, log2;
    for(log1 = 1; (1 << log1) < h[x]; ++log1);
    for(log2 = 1; (1 << log2) < h[y]; ++log2);

    for(int k = log1; k >= 0; --k)
        if(h[x] - (1 << k) >= h[y]){
            mx=maxim(mx, maxi[k][x]);
            x = str[k][x];
        }

    if(x == y) return mx;

    for(int k = log2; k >= 0; --k)
        if(str[k][x] != str[k][y]){
            mx=maxim(mx, maxi[k][x]);
            mx=maxim(mx, maxi[k][y]);
            x = str[k][x];
            y = str[k][y];
        }
    mx=maxim(mx, maxi[0][x]);
    mx=maxim(mx, maxi[0][y]);
    return mx;
}
int main()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);
    int n, m, k, n1, n2;
    scanf("%d%d%d", &n, &m, &k);
    for(int i=1;i<=m;++i)
        scanf("%d%d%d", &grf[i].x, &grf[i].y, &grf[i].cost);
    sort(grf+1, grf+m+1, cresc);
    for(int i=1;i<=n;++i)
        t[i]=i;
    for(int i=1;i<=m; ++i)
    {
        if(t[father(grf[i].x)]!=t[father(grf[i].y)])
        {
            join(grf[i].x, grf[i].y);
            adauga(grf[i].x, grf[i].y, grf[i].cost);
            adauga(grf[i].y, grf[i].x, grf[i].cost);
        }
    }
    for(int i=1;i<=n;++i)
    {
        if(!viz[i]){
        str[0][i]=0;
        maxi[0][i]=0;
        dfs(i);
        }
    }
    calculate(n);
    for(int i=1;i<=k;++i)
    {
        scanf("%d%d", &n1, &n2);
        printf("%d\n", query(n1, n2));
    }
    return 0;
}