Cod sursa(job #1934873)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 21 martie 2017 21:21:56
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define N 15005
#define log 15
using namespace std;
struct latura
{
    int a,b,c;
};
struct latura2
{
    int x,c;
};

int n,m,k,i,j,x,y;
int t[N],lvl[N],anc[log][N],cost[log][N];
latura lat[N*2];
vector<latura2> g[N];

int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
bool cmp(latura a,latura b)
{
    return a.c<b.c;
}
int tata(int x)
{
    if(t[x]==0)
        return x;
    t[x]=tata(t[x]);
    return t[x];
}
void unire(int x,int y)
{
    t[tata(x)]=tata(y);
}
void kruskal()
{
    sort(lat,lat+m,cmp);

    int nr=1,a,b,c;

    for(i=0;i<m && nr<n;i++)
    {
        a=lat[i].a;
        b=lat[i].b;
        c=lat[i].c;
        if(tata(a)!=tata(b))
        {
            nr++;
            unire(a,b);
            g[a].push_back({b,c});
            g[b].push_back({a,c});
            if(!anc[0][a])
            {
                anc[0][a]=b;
                cost[0][a]=c;
            }
            else
            {
                anc[0][b]=a;
                cost[0][b]=c;
            }
        }
    }
}
int getrad()
{
    for(i=1;i<=n;i++)
        if(anc[0][i]==0)
            return i;
}
void getlvl(int x,int ant)
{
    for(int i=0;i<g[x].size();i++)
        if(g[x][i].x!=ant)
        {
            lvl[g[x][i].x]=lvl[x]+1;
            getlvl(g[x][i].x,x);
        }
}
void build()
{
    for(i=1;(1<<i)<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            anc[i][j]=anc[i-1][anc[i-1][j]];
            cost[i][j]=max(cost[i-1][j],cost[i-1][anc[i-1][j]]);
        }
    }
}
int query(int x,int y)
{
    int dif,minc,i;
    if(lvl[x]<lvl[y])
        swap(x,y);

    dif=lvl[x]-lvl[y];
    minc=0;

    for(i=0;i<log;i++)
        if(dif & (1<<i))
        {
            minc=max(minc,cost[i][x]);
            x=anc[i][x];
        }

    for(i=0;i<log;i++)
        if(anc[i][x]!=anc[i][y])
        {
            minc=max(minc,cost[i][x]);
            minc=max(minc,cost[i][y]);
            x=anc[i][x];
            y=anc[i][y];
        }

    if(x!=y)
        minc=max(minc,cost[0][x]);

    return minc;
}

int main()
{
    FILE *f1,*f2;
    f1=fopen("radiatie.in","r");
    f2=fopen("radiatie.out","w");

    fscanf(f1,"%d%d%d",&n,&m,&k);
    for(i=0;i<m;i++)
        fscanf(f1,"%d%d%d",&lat[i].a,&lat[i].b,&lat[i].c);

    kruskal();
    getlvl(getrad(),0);
    build();

    for(i=0;i<k;i++)
    {
        fscanf(f1,"%d%d",&x,&y);
        fprintf(f2,"%d\n",query(x,y));
    }

    return 0;
}