Cod sursa(job #3230477)

Utilizator Alexia1029384756Alexia Mocanu Alexia1029384756 Data 21 mai 2024 18:32:33
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

struct Edge {
    int u, v, length;
    bool operator<(const Edge& other) const {
        return length < other.length;
    }
};

struct Query {
    int x, y, index;
};

vector<int> parent, rank;

int find(int u) {
    if (u != parent[u]) {
        parent[u] = find(parent[u]);
    }
    return parent[u];
}

void unite(int u, int v) {
    int rootU = find(u);
    int rootV = find(v);
    if (rootU != rootV) {
        if (rank[rootU] > rank[rootV]) {
            parent[rootV] = rootU;
        } else if (rank[rootU] < rank[rootV]) {
            parent[rootU] = rootV;
        } else {
            parent[rootV] = rootU;
            rank[rootU]++;
        }
    }
}

bool canReachWithMaxEdge(int N, const vector<Edge>& edges, int maxLength, int start, int end) {
    parent.resize(N + 1);
    rank.resize(N + 1, 0);
    for (int i = 1; i <= N; ++i) {
        parent[i] = i;
    }
    
    for (const auto& edge : edges) {
        if (edge.length > maxLength) break;
        unite(edge.u, edge.v);
        if (find(start) == find(end)) {
            return true;
        }
    }
    return false;
}

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

    int N, M, K;
    fin >> N >> M >> K;

    vector<Edge> edges(M);
    for (int i = 0; i < M; ++i) {
        fin >> edges[i].u >> edges[i].v >> edges[i].length;
    }

    sort(edges.begin(), edges.end());

    vector<Query> queries(K);
    for (int i = 0; i < K; ++i) {
        fin >> queries[i].x >> queries[i].y;
        queries[i].index = i;
    }

    vector<int> results(K);

    for (const auto& query : queries) {
        int left = 0, right = 1e9;
        int answer = right;

        while (left <= right) {
            int mid = (left + right) / 2;
            if (canReachWithMaxEdge(N, edges, mid, query.x, query.y)) {
                answer = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        results[query.index] = answer;
    }

    for (const auto& result : results) {
        fout << result << "\n";
    }

    fin.close();
    fout.close();

    return 0;
}