Cod sursa(job #3195029)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 19 ianuarie 2024 22:37:51
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define NMAX 15001
#define MMAX 30001
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n,m,k,nr,x,y,maxi,t[NMAX],t1[NMAX],niv[NMAX],c[NMAX];
struct muchie {
    int x,y,c;
}v[MMAX];
vector<pair<int,int>> l[NMAX];

bool cmp(muchie a,muchie b) {
    return a.c<b.c;
}

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

void dfs(int nod,int tata) {
    t1[nod]=tata;
    niv[nod]=niv[tata]+1;
    for (int i=0;i<l[nod].size();i++) {
        int vec=l[nod][i].first;
        int cost=l[nod][i].second;
        if (vec!=tata) {
            c[vec]=cost;
            dfs(vec,nod);
        }
    }
}

int main() {
    fin>>n>>m>>k;
    for (int i=1;i<=m;i++)
        fin>>v[i].x>>v[i].y>>v[i].c;
    sort(v+1,v+m+1,cmp);
    for (int i=1;i<=n;i++)
        t[i]=-1;
    int i=1;
    while (nr<n-1) {
        int rx=root(v[i].x);
        int ry=root(v[i].y);
        if (rx!=ry) {
            nr++;
            l[rx].push_back({ry,v[i].c});
            l[ry].push_back({rx,v[i].c});
            if (-t[rx]>-t[ry]) {
                t[rx]+=t[ry];
                t[ry]=rx;
            }
            else {
                t[ry]+=t[rx];
                t[rx]=ry;
            }
        }
        i++;
    }
    dfs(1,0);
    while (k--) {
        fin>>x>>y;
        maxi=0;
        while (niv[x]>niv[y]) {
            maxi=max(maxi,c[x]);
            x=t1[x];
        }
        while (niv[y]>niv[x]) {
            maxi=max(maxi,c[y]);
            y=t1[y];
        }
        while (x!=y) {
            maxi=max(maxi,max(c[x],c[y]));
            x=t1[x];
            y=t1[y];
        }
        fout<<maxi<<"\n";
    }
    return 0;
}