Cod sursa(job #2979335)

Utilizator octavi26octavian octavi26 Data 14 februarie 2023 22:07:04
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <bits/stdc++.h>
#define N 30008
#define M 1000008

using namespace std;

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

int n, m, q;
int Rang[N];
int T[N];
vector< pair<int, int> > g[N];
int ET[2 * N];
int last[2 * N];
int R[2 * N][20];
int Log[2 * N];
int f[N];
int finv[N];
int depth[N];
bool viz[N];
int et;

struct muchii
{
    int x, y, c;
} much[N];

void Citire()
{
    int i;
    int x, y, c;
    fin >> n >> m >> q;

    for( i=1; i<=m; i++ )
    {
        fin >> x >> y >> c;
        much[i].x = x;
        much[i].y = y;
        much[i].c = c;
    }

    for( i=1; i<=n; i++ )
        Rang[i] = 1, T[i] = i;
}

void DFS( int x )
{
    et++;
    f[x] = et;
    finv[et] = x;

    viz[x] = 1;
    ET[++m] = f[x];
    last[f[x]] = m;
    for( auto y : g[x] )
        if( !viz[y.first] )
        {
            depth[y.first] = depth[x] + 1;
            T[y.first] = x;
            DFS(y.first);
            ET[++m] = f[x];
            last[f[x]] = m;
        }
}

void Precalculare()
{
    int i, j;
    for( i=2; i<=m; i++ )
        Log[i] = Log[i / 2] + 1;

    for( i=1; i<=m; i++ )
        R[i][0] = ET[i];

    for( j=1; j<=Log[m]; j++ )
        for( i=1; i + (1 << (j - 1)) <= m; i++ )
            R[i][j] = min( R[i][j - 1], R[i + (1 << (j - 1))][j - 1] );
}

int lca( int x, int y )
{
    x = f[x];
    y = f[y];

    int a, b;
    int k;

    a = last[x];
    b = last[y];
    if( a > b )
        swap(a, b);

    k = Log[ b - a + 1 ];
    return finv[min( R[a][k], R[b - (1 << k) + 1][k] )];
}

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

int Find( int x )
{
    return ( T[x] == x ) ? x : Find( T[x] );
}

void Union( int x, int y )
{
    int xx = Find(x);
    int yy = Find(y);
    if( Rang[xx] > Rang[yy] )
        swap( xx, yy );
    T[xx] = yy;
    Rang[yy] += Rang[xx];
}

void Rezolvare()
{
    int i;
    sort( much + 1, much + m + 1, cmp );
    for( i=1; i<=m; i++ )
    {
        int x = much[i].x;
        int y = much[i].y;
        int c = much[i].c;
        if( Find(x) != Find(y) )
        {
            Union(x, y);
            g[x].push_back( make_pair(y, c) );
            g[y].push_back( make_pair(x, c) );
        }
    }

    for( i=1; i<=n; i++ )
    {
        cout << i << ": ";
        for( auto y : g[i] )
            cout << y.first << " ";
        cout << "\n";
    }

    DFS(1);
    Precalculare();
    int x, y;
    while( q-- )
    {
        fin >> x >> y;
        int k = lca(x, y);
        cout << x << " " << y << " " << k << "\n";
    }
}

int main()
{
    Citire();
    Rezolvare();
    return 0;
}