Cod sursa(job #2477467)

Utilizator anamariatoaderAna Toader anamariatoader Data 20 octombrie 2019 13:47:06
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <algorithm>
#include <vector>

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

int n,m,k,i,x,y,c,tata[15005],K,s;
int nivel[15005],cost[15005];
struct nr{
    int x,y,c;
}a[30005];
struct arc{
    int nod,cost;
};
int cmp(nr a, nr b){
    return a.c < b.c;
}
vector <int> g[15005];

int parinte(int nod){
    while(tata[nod]>0)
        nod = tata[nod];
    return nod;
}

void dfs(int nod, int niv){
    nivel[nod] = niv;
    for(int i=0;i<g[nod].size();i++)
       // if(!nivel[g[nod][i].nod])
            dfs(g[nod][i],niv+1);
}

int main(){
    fin>>n>>m>>K;
    for(i=1;i<=m;i++){
        fin>>x>>y>>c;
        a[i].x=x;
        a[i].y=y;
        a[i].c=c;
    }
    sort(a+1,a+m+1,cmp);
    for(i=1;i<=n;i++)
        tata[i]=-1;
    i=1; k=n-1;
    while(k>0){
        x = parinte(a[i].x);
        y = parinte(a[i].y);
        if(x != y){
            if(tata[x]<tata[y]){
                tata[x]+=tata[y];
                tata[y]=x;
                cost[y]=a[i].c;
                g[x].push_back({y});
                s=x;
            }
            else{
                tata[y]+=tata[x];
                tata[x]=y;
                cost[x]=a[i].c;
                g[y].push_back({x});
                s=y;
            }
            k--;
        }
        i++;
    }

    dfs(s,1);
    for(i=1;i<=K;i++){
        fin>>x>>y;
        int Max = 0;
        while(nivel[x]>nivel[y]){
            Max=max(Max,cost[x]);
            x=tata[x];
        }
        while(nivel[y]>nivel[x]){
            Max=max(Max,cost[y]);
            y=tata[y];
        }
        while(x!=y){
            Max=max(Max,max(cost[y],cost[x]));
            x=tata[x];
            y=tata[y];
        }
        fout<<Max<<'\n';
    }
    return 0;
}