Cod sursa(job #2709739)

Utilizator enedumitruene dumitru enedumitru Data 21 februarie 2021 09:33:54
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
#define Nmax 15001
using namespace std;
ifstream f("radiatie.in"); ofstream g("radiatie.out");
int n,m,T,h[Nmax],t[Nmax],lev[Nmax],c[Nmax];
struct edge {int x, y, c;} e[30001];
int Level(int nod)
{   if ( lev[nod] != 0 ) return lev[nod];
    if ( t[nod] == nod ) return 1;
    return (lev[nod] = Level(t[nod]) + 1);
}
int Find(int nod)
{   if(t[nod]!=nod) return Find(t[nod]);
    return t[nod];
}
void Union(int i, int j, int k)
{   if(h[i]>h[j]) {t[j]=i; c[j]=e[k].c;}
    else
    {   t[i]=j; c[i]=e[k].c;
        if(h[i]== h[j]) h[j]++;
    }
}
void Qsort(int st, int dr)
{   int i=st-1,j= dr+1;
    do
    {   do i++; while(e[i].c<e[st].c);
        do j--; while(e[st].c<e[j].c);
        if(i<=j) {edge aux = e[i]; e[i]=e[j];e[j]=aux;}
    } while(i<=j);
    if(i<dr) Qsort(i,dr);
    if(st<j) Qsort(st,j);
}
void Kruskal()
{   Qsort(1,m);
    for(int i=1;i<=n;i++) {t[i]=i; h[i]=1;c[i]=0;}
    int nrm=n;
    for(int k=1;k<=m;k++)
    {   if(nrm==1) break;
        int r1 = Find(e[k].x);
        int r2 = Find(e[k].y);
        if(r1!=r2) {Union(r1,r2,k); nrm--;}
    }
    for(int i=1;i<=n;i++) Level(i);
}
int main()
{   f>>n>>m>>T;
    for(int i=1;i<=m;i++) f>>e[i].x>>e[i].y>>e[i].c;
    Kruskal();
    for(int a,b;T;--T)
    {   f>>a>>b;
        int cmax=0;
        while(lev[a]>lev[b]) {cmax=max(cmax, c[a]); a=t[a];}
        while(lev[b]>lev[a]) {cmax=max(cmax, c[b]); b=t[b];}
        while(a!=b) {cmax=max(cmax,max(c[a],c[b])); a=t[a]; b = t[b];}
        g<<cmax<<'\n';
    }
    g.close(); f.close(); return 0;
}