Cod sursa(job #2763146)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 11 iulie 2021 21:53:38
Problema Radiatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 15005

using namespace std;

ifstream cin("radiatie.in");
ofstream cout("radiatie.out");

struct muchie
{
    int x,y,c;
    friend bool operator < (const muchie& a, const muchie& b)
    {
        return a.c<b.c;
    }
}aux;

int n,m,k;
int sef[NMAX],ad[NMAX];
pair <int,int> t[NMAX];
vector <muchie> e;
vector <muchie> arb;
vector < pair <int, int> > adj[NMAX];


int sef_sup(int nod)
{
    if(sef[nod]!=nod)
        return sef[nod]=sef_sup(sef[nod]);
    else
        return nod;
}

void unire(int nod1, int nod2)
{
    sef[sef_sup(nod1)]=sef_sup(nod2);
}

void apm()
{
    sort(e.begin(),e.end());
    for(int i=1;i<=n;i++)
        sef[i]=i;
    for(int i=0;i<e.size();i++)
    {
        aux=e[i];
        if(sef_sup(aux.x)!=sef_sup(aux.y))
        {
            unire(aux.x,aux.y);
            arb.push_back(aux);
        }
    }
}

void dfs(int nod, int tata)
{
    ad[nod]=ad[tata]+1;
    for(pair <int,int> v : adj[nod])
        if(v.second!=tata)
        {
            dfs(v.second,nod);
            t[v.second]={v.first,nod};
        }
}

int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=m;i++)
    {
        cin>>aux.x>>aux.y>>aux.c;
        e.push_back(aux);
    }
    apm();
    for(int i=0;i<arb.size();i++)
    {
        aux=arb[i];
        adj[aux.x].push_back({aux.c,aux.y});
        adj[aux.y].push_back({aux.c,aux.x});
    }
    dfs(1,0);
    for(int i=1;i<=k;i++)
    {
        int x,y,rasp=-1;
        cin>>x>>y;
        while(ad[x]>ad[y])
        {
            rasp=max(rasp,t[x].first);
            x=t[x].second;
        }
        while(ad[x]<ad[y])
        {
            rasp=max(rasp,t[y].first);
            y=t[y].second;
        }
        while(x!=y)
        {
            rasp=max(rasp,t[x].first);
            x=t[x].second;
            rasp=max(rasp,t[y].first);
            y=t[y].second;
        }
        cout<<rasp<<'\n';
    }
    return 0;
}