Cod sursa(job #2570989)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 4 martie 2020 20:22:25
Problema Radiatie Scor 50
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <bitset>
#define dim 15010
using namespace std;

ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

int n,m,T,k,i,j,q,x,y,rx,ry,t[dim],N[2*dim],C[dim],sol,R;
vector <pair<int,int> > l[dim];
bitset <2*dim> f;

struct muchii{
    int x;
    int y;
    int c;
} v[2*dim];

bool cmp(const muchii &a, const muchii &b){
    return a.c<b.c;
    return 0;
}

int rad(int x){
    while(t[x]>0)
        x=t[x];
    return x;
}

void upd(int x, int rx){
    int y;
    while(t[x]>0){
        y=t[x];
        t[x]=rx;
        x=y;
    }
}

void dfs(int nod,int niv){
    f[nod]=1;
    N[nod]=niv;

    for(int i=0;i<l[nod].size();i++){
        int vec=l[nod][i].first;
        int cost=l[nod][i].second;

        if(!f[vec]){
            t[vec]=nod;
            C[vec]=cost;
            dfs(vec,niv+1);
        }
    }
}

int main(){
    fin>>n>>m>>T;
    for(q=1;q<=m;q++)
        fin>>v[q].x>>v[q].y>>v[q].c;
    sort(v+1,v+m+1,cmp);

    for(i=1;i<=n;i++)
        t[i]=-1;

    for(q=1;q<=m;q++){
        x=v[q].x; y=v[q].y;
        rx=rad(x); ///upd(x,rx);
        ry=rad(y); ///upd(y,ry);

        if(rx!=ry){
            if(t[rx]<t[ry]){
                t[rx]+=t[ry];
                t[ry]=rx;
                R=rx;
            }else{
                t[ry]+=t[rx];
                t[rx]=ry;
                R=ry;
            }

            ///cout<<x<<" "<<y<<" "<<v[q].c<<"\n";
            l[x].push_back(make_pair(y,v[q].c));
            l[y].push_back(make_pair(x,v[q].c));
        }
    }

    N[R]=1;
    dfs(R,1);

    for(;T;T--){
        fin>>i>>j;
        sol=-1;

        while(N[i]>N[j]){
            sol=max(sol,C[i]);
            i=t[i];
        }

        while(N[j]>N[i]){
            sol=max(sol,C[j]);
            j=t[j];
        }

        while(i!=j){
            sol=max(sol,max(C[i],C[j]));
            i=t[i];
            j=t[j];
        }

        fout<<sol<<"\n";
    }

    return 0;
}