Cod sursa(job #3230475)

Utilizator Alexia1029384756Alexia Mocanu Alexia1029384756 Data 21 mai 2024 18:30:38
Problema Radiatie Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <algorithm>

using namespace std;

struct Edge {
    int to, length;
};

vector<vector<Edge>> adj;
vector<pair<int, int>> queries;

bool canReach(int N, int maxLength, int start, int end) {
    vector<bool> visited(N + 1, false);
    queue<int> q;
    
    q.push(start);
    visited[start] = true;
    
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        
        if (node == end) return true;
        
        for (auto& edge : adj[node]) {
            if (edge.length <= maxLength && !visited[edge.to]) {
                visited[edge.to] = true;
                q.push(edge.to);
            }
        }
    }
    
    return false;
}

int findMinMaxEdgeLength(int N, int start, int end) {
    int left = 1, right = 1e9;
    int answer = right;
    
    while (left <= right) {
        int mid = (left + right) / 2;
        if (canReach(N, mid, start, end)) {
            answer = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    
    return answer;
}

int main() {
    ifstream fin("radiatie.in");
    ofstream fout("radiatie.out");
    
    int N, M, K;
    fin >> N >> M >> K;
    
    adj.resize(N + 1);
    
    for (int i = 0; i < M; ++i) {
        int a, b, c;
        fin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    
    queries.resize(K);
    for (int i = 0; i < K; ++i) {
        int x, y;
        fin >> x >> y;
        queries[i] = {x, y};
    }
    
    for (const auto& [x, y] : queries) {
        int result = findMinMaxEdgeLength(N, x, y);
        fout << result << "\n";
    }
    
    fin.close();
    fout.close();
    
    return 0;
}