Cod sursa(job #1915315)

Utilizator UrsuDanUrsu Dan UrsuDan Data 8 martie 2017 20:36:12
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.07 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <algorithm>

using namespace std;

vector< vector< pair<int,int> > >g(15010);

struct edges
{
    int a,b,dist;
};
edges v[30010];

struct stramosi
{
    int node,maxi;
};
stramosi d[15010][15];

int dad[15010];
int depth[15010];
bool viz[15010];
int ans;

int maxim(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}

bool cmp(edges x,edges y)
{
    return x.dist<y.dist;
}

int find_dad(int x)
{
    if(x==dad[x])
        return x;
    dad[x]=find_dad(dad[x]);
    return dad[x];
}

void dfs(int node)
{
    int bit,l,i;
    viz[node]=true;
    depth[node]=depth[d[node][0].node]+1;
    for(bit=1; bit<=13; bit++)
    {
        d[node][bit].node=d[d[node][bit-1].node][bit-1].node;
        d[node][bit].maxi=maxim(d[d[node][bit-1].node][bit-1].maxi,d[node][bit-1].maxi);
    }
    l=g[node].size();
    for(i=0; i<l; i++)
    {
        if(viz[g[node][i].first]==false)
        {
            d[g[node][i].first][0].node=node;
            d[g[node][i].first][0].maxi=g[node][i].second;
            dfs(g[node][i].first);
        }
    }
}

void same_level(int &x,int &y)
{
    int bit,dist;
    if(depth[x]==depth[y])
        return;
    else if(depth[x]>depth[y])
    {
        dist=depth[x]-depth[y];
        for(bit=13; bit>=0; bit--)
            if(((1<<bit) & dist)!=0)
            {
                ans=maxim(ans,d[x][bit].maxi);
                x=d[x][bit].node;
            }
    }
    else
    {
        dist=depth[y]-depth[x];
        for(bit=13; bit>=0; bit--)
            if(((1<<bit) & dist)!=0)
            {
                ans=maxim(ans,d[y][bit].maxi);
                y=d[y][bit].node;
            }
    }
}

int lca(int x,int y)
{
    int bit;
    same_level(x,y);
    if(x==y)
        return ans;

    for(bit=13; bit>=0; bit--)
        if(d[x][bit].node!=d[y][bit].node)
        {
            ans=maxim(ans,d[x][bit].maxi);
            x=d[x][bit].node;
            ans=maxim(ans,d[y][bit].maxi);
            y=d[y][bit].node;
        }
    ans=maxim(ans,maxim(d[x][0].maxi,d[y][0].maxi));

    return ans;
}

int main()
{
    srand(time(0));
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    int n,m,k,x,y,i,s=0;
    scanf("%d%d%d",&n,&m,&k);
    for(i=1; i<=m; i++)
        scanf("%d%d%d",&v[i].a,&v[i].b,&v[i].dist);
    for(i=1; i<=n; i++)
        dad[i]=i;
    sort(v+1,v+m+1,cmp);
    for(i=1; i<=m; i++)
    {
        x=find_dad(v[i].a);
        y=find_dad(v[i].b);
        if(x!=y)
        {
            if(rand()%2==0)
                dad[x]=y;
            else
                dad[y]=x;
            g[v[i].a].push_back(make_pair(v[i].b,v[i].dist));
            g[v[i].b].push_back(make_pair(v[i].a,v[i].dist));
        }
    }
    for(i=1; i<=n; i++)
        if(viz[i]==false)
            dfs(i);
    for(i=1;i<=k;i++)
    {
        ans=0;
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    return 0;
}