Pagini recente » Cod sursa (job #457125) | Cod sursa (job #1527901) | Cod sursa (job #389388) | Cod sursa (job #3290059) | Cod sursa (job #3230475)
#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;
}