Cod sursa(job #2504471)

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

using namespace std;

const int nmax=15005;

vector<pair<int,pair<int,int>>>l;
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 co)
{
    int tx=supreme(x),ty=supreme(y);
    if(d[tx]==d[ty])
    {
        d[tx]++;
        tata[ty]=tx;
        cm[ty]=co;
    }
    else
    if(d[tx]>d[ty])
    {
        tata[ty]=tx;
        cm[ty]=co;
    }
    else
    {
        tata[tx]=ty;
        cm[tx]=co;
    }
}

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

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=tata[a];
    }
    while(a!=b)
    {
        cost=max(cost,max(cm[a],cm[b]));
        a=tata[a],b=tata[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,x.first);
    while(k--)
    {
        cin>>a>>b;
        cout<<solve(a,b)<<"\n";
    }
    return 0;
}