Cod sursa(job #3286884)

Utilizator TraianQTraianQ TraianQ Data 14 martie 2025 19:27:37
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.04 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct Nod
{
    int a,b,c;
}v[30005];
int root[30005],depth[30005],marked[30005];
bool cmp(Nod x,Nod y)
{
    return x.c<y.c;
}
int find_root(int a)
{
    if(a==root[a])
        return a;
    return find_root(root[a]);
}
void UNION(int a,int b)
{
    if(depth[a]<depth[b])
    {
        root[a]=b;
    }
    else if(depth[a]>depth[b])
    {
        root[b]=a;
    }
    else
    {
        root[a]=b;
        depth[a]++;
    }
}
vector <pair<short,int>> V[15005];
int minn[15][15005],stramosi[15][15005],visited[15005];
void dfs(int k)
{
    for(auto N:V[k])
    {
        int x=N.first,y=N.second;
        if(visited[x]==0)
        {
            //fout<<k<<" "<<x<<" "<<y<<"\n";
            visited[x]=1;
            minn[0][x]=y;
            stramosi[0][x]=k;
            depth[x]=depth[k]+1;
            dfs(x);
        }
    }
}
int main()
{
    int n,m,Q;
    fin>>n>>m>>Q;
    for(int i=1;i<=m;i++)
    {
        fin>>v[i].a>>v[i].b>>v[i].c;
    }
    sort(v+1,v+n+1,cmp);
    for(int i=1;i<=n;i++)
        root[i]=depth[i]=i;
    int counter=0;
    for(int i=1;i<=m;i++)
        if(counter<n-1)
        {
            int a=v[i].a,b=v[i].b,c=v[i].c;
            a=find_root(a);
            b=find_root(b);
            if(a!=b)
            {
                UNION(a,b);
                marked[i]=1;
                counter++;
            }
        }
    for(int i=1;i<=n;i++)
        depth[i]=0;
    for(int i=1;i<=m;i++)
    if(marked[i])
    {
        int a=v[i].a,b=v[i].b,c=v[i].c;
        //fout<<a<<" "<<b<<" "<<c<<"\n";
        V[a].push_back({b,c});
        V[b].push_back({a,c});
    }
    visited[1]=1;
    dfs(1);
    minn[0][1]=1000000007;
    for(int i=1;i<=16;i++)
        for(int j=1;j<=n;j++)
        {
            minn[i][j]=min(minn[i-1][j],minn[i-1][stramosi[i-1][j]]);
            stramosi[i][j]=stramosi[i-1][stramosi[i-1][j]];
        }
    for(int q=1;q<=Q;q++)
    {
        int a,b,ca,cb;
        fin>>a>>b;
        if(depth[a]<depth[b])
            swap(a,b);
        ca=a;
        cb=b;
        int response=0;
        for(int i=16;i>=0;i--)
            if(depth[ca]-(1<<i)>depth[b])
            {
                response=max(response,minn[i][ca]);
                ca=stramosi[i][ca];
            }
        if(depth[ca]!=depth[b])
        {
            response=max(response,minn[0][ca]);
            ca=stramosi[0][ca];
        }
        if(ca==b)
        {
            fout<<response<<'\n';
        }
        else
        {
            for(int i=16;i>=0;i--)
                if(stramosi[i][ca]!=stramosi[i][cb])
                {
                    response=max(response,minn[i][ca]);
                    response=max(response,minn[i][cb]);
                    ca=stramosi[i][ca];
                    cb=stramosi[i][cb];
                }
            fout<<response<<'\n';
        }
    }
    return 0;
}