Cod sursa(job #2158964)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 10 martie 2018 17:31:55
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
# include <fstream>
# include <algorithm>
# include <vector>
# define DIM 30010
# define c first.first
# define x first.second
# define y second
# define f first
# define s second
using namespace std;
ifstream  fin("radiatie.in");
ofstream fout("radiatie.out");
vector<pair<int,int> > Lista[DIM];
pair<pair<int,int>,int> v[DIM];
int t[20][DIM],d[20][DIM],tata[DIM],niv[DIM];
int n,k,m,a,b,i,j,step,ra,rb,sol;
int rad(int a){
    int b=a;
    while(tata[a]>0)
        a=tata[a];
    while(tata[b]>0){
        int aux=b;
        b=tata[b];
        tata[aux]=a;
    }
    return a;
}
void dfs(int nc){
    for(int i=0;i<Lista[nc].size();i++){
        int nv=Lista[nc][i].f;
        int cost=Lista[nc][i].s;
        if(t[0][nv]==0){
            t[0][nv]=nc;
            niv[nv]=niv[nc]+1;
            d[0][nv]=cost;
            dfs(nv);
        }
    }
}
int main () {
    fin>>n>>m>>k;
    for(i=1;i<=n;i++)
        tata[i]=-1;
    for(i=1;i<=m;i++)
        fin>>v[i].x>>v[i].y>>v[i].c;
    sort(v+1,v+m+1);
    for(i=1;i<=m;i++){
        a=v[i].x;
        b=v[i].y;
        ra=rad(a);
        rb=rad(b);
        if(ra!=rb){
            Lista[a].push_back(make_pair(b,v[i].c));
            Lista[b].push_back(make_pair(a,v[i].c));
            if(t[ra]<t[rb]){
                tata[ra]+=tata[rb];
                tata[rb]=ra;
            }
            else{
                tata[rb]+=tata[ra];
                tata[ra]=rb;
            }
        }
    }
    t[0][1]=-1;
    niv[1]=1;
    dfs(1);
    t[0][1]=0;
    for(j=1;(1<<j)<=n;j++)
        for(i=1;i<=n;i++){
            t[j][i]=t[j-1][t[j-1][i]];
            d[j][i]=max(d[j-1][i],d[j-1][t[j-1][i]]);
        }
    for(i=1;i<=k;i++){
        fin>>a>>b;
        if(niv[a]<niv[b])
            swap(a,b);
        sol=0;
        if(niv[a]>niv[b]){
            for(j=1;(1<<(j-1))<=n;j++);
            for(;j>=0;j--)
                if(niv[t[j][a]]>=niv[b]){
                    sol=max(sol,d[j][a]);
                    a=t[j][a];
                }
        }
        if(a==b){
            fout<<sol<<"\n";
            continue;
        }
        for(j=1;(1<<(j-1))<=n;j++);
        for(;j>=0;j--){
            if(t[j][a]!=t[j][b]){
                sol=max(sol,d[j][a]);
                sol=max(sol,d[j][b]);
                a=t[j][a];
                b=t[j][b];
            }
        }
        sol=max(sol,d[0][a]);
        sol=max(sol,d[0][b]);
        //fout<<sol<<"\n";
    }
    return 0;
}