Cod sursa(job #2709730)

Utilizator enedumitruene dumitru enedumitru Data 21 februarie 2021 08:13:38
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <bits/stdc++.h>
#define NM 15001
#define MM 30001
#define Max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
ifstream f("radiatie.in"); ofstream g("radiatie.out");
int n, m, T;
int i, j, k;
int h[NM], t[NM], lev[NM], c[NM];
int a, b, cmax;
struct edge {int x, y, c;} e[MM],aux;
void Qsort(int st, int dr);
void Kruskal();
int Find(int nod);
void Union(int i, int j);
int Level(int nod);
int main()
{   ///scanf("%d %d %d", &n, &m, &T);
    f>>n>>m>>T;
    for(i=1;i<=m;i++)
        ///scanf("%d %d %d", &e[i].x, &e[i].y, &e[i].c);
        f>>e[i].x>>e[i].y>>e[i].c;
    Kruskal();
    for ( int g = 1; g <= T; g++ )
    {
        ///scanf("%d %d", &a, &b);
        f>>a>>b;
        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];
        ///printf("%d\n", cmax);
        g<<cmax<<'\n';
    }
    return 0;
}
void Qsort(int st, int dr)
{
    int i = st-1;
    int 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 )
            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 ( i = 1; i <= n; i++ )
        t[i] = i, h[i] = 1, c[i] = 0;
    int nrm = n;
    for ( 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);
            nrm--;
        }
    }
    for ( i = 1; i <= n; i++ )
        Level(i);
}
int Find(int nod)
{   if ( t[nod] != nod ) return Find(t[nod]);
    return t[nod];
}
void Union(int i, int j)
{   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]++;
    }
}
int Level(int nod)
{   if ( lev[nod] != 0 ) return lev[nod];
    if ( t[nod] == nod ) return 1;
    return (lev[nod] = Level(t[nod]) + 1);
}