Cod sursa(job #2582954)

Utilizator RedXtreme45Catalin RedXtreme45 Data 17 martie 2020 15:53:32
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
#define Nmax 15010
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n,m,k,ap[Nmax],l[Nmax],dp[15][2*Nmax],nr,pap[Nmax],val[Nmax];
struct ceva
{
    int nod1,nod2,cost;
} v[Nmax];
vector <pair<int,int> > G[Nmax];
int cmp(ceva a,ceva b)
{
    return a.cost<b.cost;
}
int stramos(int x)
{
    if (ap[x]==x)
        return ap[x];
    ap[x]=stramos(ap[x]);
    return ap[x];
}
void apm()
{
    int i,j,nr1=0;
    for (i=1; i<=m && nr1<n; i++)
    {
        int a=stramos(v[i].nod1),b=stramos(v[i].nod2);
        if (a!=b)
        {
            nr1++;
            G[v[i].nod1].push_back({v[i].nod2,v[i].cost});
            G[v[i].nod2].push_back({v[i].nod1,v[i].cost});
            if (l[a]<l[b])
            {
                l[b]+=l[a];
                ap[a]=ap[b];
            }
            else
            {
                l[a]+=l[b];
                ap[b]=ap[a];
            }
        }
    }
}
void DFS(int start,int str)
{
    l[start]=l[str]+1;
    dp[0][++nr]=start;
    if (!pap[start])
        pap[start]=nr;
    for (auto i:G[start])
    {
        if (str!=i.first)
        {
            DFS(i.first,start);
            dp[0][++nr]=start;
        }
    }
}
void RMQ()
{
    int o=2*n,x=0,i,j;
    while ((1<<x)<o)
        x++;
    for (i=1; i<x; i++)
    {
        for (j=1; j<=o-(1<<i)+1; j++)
        {
            dp[i][j]=dp[i-1][j];
            if (l[dp[i][j]]>l[dp[i-1][j+(1<<(i-1))]])
                dp[i][j]=dp[i-1][j+(1<<(i-1))];
        }
    }
}
int parc(int start,int stramos)
{
    queue <pair<int,int> > q;
    q.push({start,0});
    while (!q.empty())
    {
        int x=q.front().first;
        int y=q.front().second;
        q.pop();
        for (auto i:G[x])
        {
            if (l[i.first]<l[x])
            {
                y=max(y,i.second);
                q.push({i.first,y});
                if (i.first==stramos)
                    return y;
            }
        }
    }
}
int main()
{
    int i,a,b;
    fin>>n>>m>>k;
    for (i=1; i<=n; i++)
        ap[i]=i,l[i]=1;
    for (i=1; i<=m; i++)
        fin>>v[i].nod1>>v[i].nod2>>v[i].cost;
    sort (v+1,v+m+1,cmp);
    apm();
    memset(l,0,sizeof l);
    l[0]=0;
    DFS(1,0);
    RMQ();
    memset(ap,0,sizeof ap);
    for (i=1;i<=k;i++)
    {
        fin>>a>>b;
        int a1=min(pap[a],pap[b]),b1=max(pap[a],pap[b]);
        int lung=b1-a1+1,x=0;
        while ((1<<x)<=lung)
            x++;
        x--;
        int min1=dp[x][a1];
        if (l[min1]>l[dp[x][b1-(1<<x)+1]])
            min1=dp[x][b1-(1<<x)+1];
        fout<<max(parc(a,min1),parc(b,min1))<<"\n";
    }
    return 0;
}