Cod sursa(job #2767119)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 4 august 2021 19:54:39
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
#include <algorithm>

using namespace std;
const int VMAX = 15000, EMAX = 30000;

struct edge
{
    int v1, v2, w;
};
bool operator <(const edge &x, const edge &y)
{ return x.w < y.w; }

int boss[VMAX], best[VMAX], h[VMAX];
edge edges[EMAX];

void UF_init(int n);
int UF_find(int e);
void UF_union(int e1, int e2, int l);
int query(int node1, int node2);

int main()
{
    int n, m, k, i, node1, node2;
    FILE *fin = fopen("radiatie.in", "r");
    fscanf(fin, "%d%d%d", &n, &m, &k);
    for (i = 0; i < m; i++)
    {
        fscanf(fin, "%d%d%d", &edges[i].v1, &edges[i].v2, &edges[i].w);
        edges[i].v1--;
        edges[i].v2--;
    }

    sort(edges, edges + m);

    UF_init(n);
    for (i = 0; i < m; i++)
        UF_union(edges[i].v1, edges[i].v2, edges[i].w);

    FILE *fout = fopen("radiatie.out", "w");
    for (i = 0; i < k; i++)
    {
        fscanf(fin, "%d%d", &node1, &node2);
        fprintf(fout, "%d\n", query(node1 - 1, node2 - 1));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}

void UF_init(int n)
{
    for (int i = 0; i < n; i++)
    {
        boss[i] = i;
        h[i] = 1;
        best[i] = 0;
    }
}
int UF_find(int e)
{
    if (boss[e] == e)
        return e;
    return UF_find(boss[e]);
}
void UF_union(int e1, int e2, int l)
{
    int boss1 = UF_find(e1);
    int boss2 = UF_find(e2);

    if (boss1 == boss2)
        return;

    if (h[boss1] > h[boss2])
    {
        best[boss2] = l;
        boss[boss2] = boss1;
    }
    else if (h[boss1] < h[boss2])
    {
        best[boss1] = l;
        boss[boss1] = boss2;
    }
    else
    {
        best[boss1] = l;
        boss[boss1] = boss2;
        h[boss2]++;
    }
}
int query(int node1, int node2)
{
    int lmax = 0;
    while (boss[node1] != boss[node2])
    {
        if(h[node1] < h[node2])
        {
            lmax = max(lmax, best[node1]);
            node1 = boss[node1];
        }
        else
        {
            lmax = max(lmax, best[node2]);
            node2 = boss[node2];
        }
    }
    return lmax;
}