Pagini recente » Cod sursa (job #3275259) | Cod sursa (job #1945159) | Cod sursa (job #87221) | Cod sursa (job #2163923) | Cod sursa (job #3230477)
#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;
}