Cod sursa(job #2504440)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 4 decembrie 2019 22:08:09
Problema Radiatie Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

const int nmax=15005;

vector<pair<int,pair<int,int>>>l;
vector<pair<int,int>>apm[nmax];
vector<int>h[nmax];
int tata[nmax],sz[nmax],d[nmax],cm[nmax],t[nmax];

int supreme(int a)
{
    int x=a,y=a;
    while(x!=tata[x])
        x=tata[x];
    tata[a]=x;
    while(y!=tata[y])
    {
        y=tata[y];
        tata[y]=x;
    }
    return x;
}

void unite(int x,int y)
{
    int tx=supreme(x),ty=supreme(y);
    if(sz[tx]>sz[ty])
    {
        tata[ty]=tx;
        sz[tx]+=sz[ty];
    }
    else
    {
        tata[tx]=ty;
        sz[ty]+=sz[tx];
    }
}

bool check(int x,int y)
{
    int tx=supreme(x),ty=supreme(y);
    return (tx==ty);
}

void build(int nod,int prec)
{
    t[nod]=prec;
    if(prec!=-1)
        d[nod]=d[prec]+1;
    else
        d[nod]=0;
    h[d[nod]].push_back(nod);
    for(auto x:apm[nod])
        if(x.first!=prec)
        {
            build(x.first,nod);
            cm[x.first]=x.second;
        }
}

int solve(int a,int b)
{
    int cost=0;
    if(d[a]<d[b])
        swap(a,b);
    while(d[a]!=d[b])
    {
        cost=max(cm[a],cost);
        a=t[a];
    }
    while(a!=b)
    {
        cost=max(cost,max(cm[a],cm[b]));
        a=t[a],b=t[b];
    }
    return cost;
}

int main()
{
    ifstream cin("radiatie.in");
    ofstream cout("radiatie.out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,m,k,x,y,c,a,b;
    cin>>n>>m>>k;
    for(int i=1; i<=m; i++)
    {
        cin>>x>>y>>c;
        l.push_back({c,{x,y}});
    }
    sort(l.begin(),l.end());
    for(int i=1; i<=n; i++)
    {
        tata[i]=i;
        sz[i]=1;
    }
    for(auto x:l)
        if(check(x.second.first,x.second.second)==false)
        {
            unite(x.second.first,x.second.second);
            apm[x.second.first].push_back({x.second.second,x.first});
            apm[x.second.second].push_back({x.second.first,x.first});
        }
    ///Am construit apm-ul
    build(1,-1);/*
    for(int i=1; i<=n; i++)
        if(!apm[i].empty())
            for(auto z:apm[i])
                if(i<z.first)
                cout<<i<<" "<<z.first<<"\n";
    cout<<"\n";
    for(int i=1; i<=n; i++)
        cout<<i<<": "<<cm[i]<<"\n";*/
    while(k--)
    {
        cin>>a>>b;
        cout<<solve(a,b)<<"\n";
    }
    return 0;
}