Pagini recente » Cod sursa (job #1463133) | Cod sursa (job #412565) | Cod sursa (job #3137394) | Cod sursa (job #2957034) | Cod sursa (job #2847661)
#include <fstream>
#include <vector>
#include <algorithm>
#include <bitset>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct krusk {
int x, y, c;
};
bool cmp(krusk a, krusk b) {
return a.c < b.c;
}
vector<krusk> v;
int n, m, k, T[15005], c[15005], l[15005], root;
vector<int> G[15005];
bitset<15005> V;
void Union(int a, int b, int cost) {
if(T[a] <= T[b]) {
T[a] += T[b];
T[b] = a;
G[a].push_back(b);
c[b] = cost;
root = a;
} else {
T[b] += T[a];
T[a] = b;
G[b].push_back(a);
c[a] = cost;
root = b;
}
}
int Find(int nod) {
int x = nod;
while(T[x] > 0) {
x = T[x];
}
while(T[nod] > 0) {
int temp = T[nod];
T[nod] = x;
nod = temp;
}
return nod;
}
void dfs(int nod) {
V[nod] = true;
for(auto it : G[nod]) {
if(!V[it]) {
l[it] = l[nod] + 1;
dfs(it);
}
}
}
int main() {
fin >> n >> m >> k;
for(int i = 0; i < m; i++) {
int x, y, c;
fin >> x >> y >> c;
v.push_back({x, y, c});
}
sort(v.begin(), v.end(), cmp);
for(int i = 1; i <= n; i++) {
T[i] = -1;
}
for(int i = 0; i < m; i++) {
int nod1 = Find(v[i].x);
int nod2 = Find(v[i].y);
if(nod1 != nod2) {
Union(nod1, nod2, v[i].c);
}
}
l[root] = 1;
dfs(root);
for(int i = 1; i <= k; i++) {
int x, y;
fin >> x >> y;
int maxim = 0;
while(l[x] > l[y]) {
maxim = max(maxim, c[x]);
x = T[x];
}
while(l[y] > l[x]) {
maxim = max(maxim, c[y]);
y = T[y];
}
while(x != y) {
maxim = max(maxim, max(c[x], c[y]));
x = T[x], y = T[y];
}
fout << maxim << "\n";
}
return 0;
}