Cod sursa(job #2351332)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 22 februarie 2019 10:52:22
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

#define Nmax 15005
#define Mmax 30005

using namespace std;

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

struct edge
{
    int a, b, len;
    int pos;
};

bool qx(edge a, edge b)
{
    return a.len < b.len;
}

edge E[Mmax], Q[Nmax];
int N, M, K;
int T[Nmax];
int ans[Nmax];

int find(int node)
{
    if(node == T[node])
        return node;
    return T[node] = find(T[node]);
}

void unite(int A, int B)
{
    A = find(A);
    B = find(B);
    if(A != B)
        T[A] = B;
}

int main()
{
    fin >> N >> M >> K;
    for(int i = 1; i <= M; i++)
        fin >> E[i].a >> E[i].b >> E[i].len;
    for(int i = 1; i <= K; i++)
        fin >> Q[i].a >> Q[i].b, Q[i].pos = i;
    sort(E + 1, E + M + 1, qx);
    for(int bit = 30; bit >= 0; bit--)
    {
        for(int i = 1; i <= N; i++)
            T[i] = i;
        for(int i = 1; i <= K; i++)
            Q[i].len += (1 << bit);
        sort(Q + 1, Q + K + 1, qx);
        int j = 1;
        for(int i = 1; i <= K; i++)
        {
            while(j <= M && E[j].len <= Q[i].len)
                unite(E[j].a, E[j].b), j++;
            if(find(Q[i].a) == find(Q[i].b))
                Q[i].len -= (1 << bit);
        }
    }
    for(int i = 1; i <= K; i++)
        ans[Q[i].pos] = Q[i].len + 1;
    for(int i = 1; i <= K; i++)
        fout << ans[i] << "\n";
    return 0;
}