Pagini recente » Cod sursa (job #126077) | Cod sursa (job #2676445) | Cod sursa (job #362435) | Monitorul de evaluare | Cod sursa (job #2736637)
#include <bits/stdc++.h>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct Edge{
int u, v, wt;
bool operator < (const Edge &e) const{
return wt < e.wt;
}
};
vector <Edge> edges;
int parent[15001], rnk[15001], rad[15001];
int N, M, K;
int find_set(int v){
if(v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
void union_sets(int a, int b, int cost){
a = find_set(a);
b = find_set(b);
if(a != b){
if(rnk[a] < rnk[b])
swap(a, b);
parent[b] = a;
rad[b] = cost;
if(rnk[a] == rnk[b])
rnk[a]++;
}
}
void Kruskal(){
for(int i = 1;i <= N;i++)
parent[i] = i, rnk[i] = 0;
sort(edges.begin(), edges.end());
for(Edge e : edges)
if(find_set(e.u) != find_set(e.v))
union_sets(e.u, e.v, e.wt);
}
int lca(int a, int b){
int ans = -1;
while(a != b){
if(rnk[a] < rnk[b]){
ans = max(ans, rad[a]);
a = parent[a];
}
else{
ans = max(ans, rad[b]);
b = parent[b];
}
}
return ans;
}
int main(){
f >> N >> M >> K;
while(M--){
Edge E;
f >> E.u >> E.v >> E.wt;
edges.emplace_back(E);
}
Kruskal();
while(K--){
int a, b;
f >> a >> b;
g << lca(a, b) << "\n";
}
}