Cod sursa(job #2675375)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 21 noiembrie 2020 15:16:06
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MMAX 30000
#define NMAX 15000
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n,M,k;
vector<int > adj[NMAX+5];
int dad[NMAX+5],rang[NMAX+5],grad[NMAX+5],l[NMAX+5];
struct edge
{
    int x,y,c;
};
edge m[MMAX+5];
bool cmpedge(edge a,edge b)
{
    return a.c<b.c;
}
int root(int node)
{
    if(dad[node]==0)
        return node;
    return root(dad[node]);
}
void unite(int r,int p,int cost)
{
    if(rang[r]>rang[p])
    {
        rang[r]+=rang[p];
        dad[p]=r;
        l[p]=cost;
        adj[r].pb(p);
    }
    else
    {
        rang[p]+=rang[r];
        dad[r]=p;
        l[r]=cost;
        adj[p].pb(r);
    }
}
void dfs(int node)
{
    for(auto x:adj[node])
    {
        grad[x]=grad[node]+1;
        dfs(x);

    }
}
int main()
{
    f>>n>>M>>k;
    for(int i=1; i<=M; i++)
    {
        f>>m[i].x>>m[i].y>>m[i].c;
    }
    sort(m+1,m+M+1,cmpedge);
    for(int i=1; i<=n; i++)
    {
        dad[i]=0;
        rang[i]=1;
    }
    int nr=0;
    for(int i=1; i<=M; i++)
    {
        int rx=root(m[i].x);
        int ry=root(m[i].y);
        if(rx!=ry)
        {
            unite(rx,ry,m[i].c);
            nr++;
        }
        //cout<<rx<<" "<<ry<<'\n';
    }
    for(int i=1; i<=n; i++)
    {
        if(dad[i]==0)
        {
            dad[i]=i;
            dfs(i);
        }
    }
    for(int i=1; i<=k; i++)
    {
        int x,y;
        f>>x>>y;
        int maxim=0;
        if(grad[x]>grad[y])
        {
            swap(x,y);
        }
        while(grad[y]>grad[x])
        {
            maxim=max(maxim,l[y]);
            y=dad[y];

        }
        while(x!=y)
        {
            maxim=max(maxim,l[x]);
            maxim=max(maxim,l[y]);
            x=dad[x];
            y=dad[y];

        }
        g<<maxim<<'\n';
    }


}