Pagini recente » Borderou de evaluare (job #2265342) | Borderou de evaluare (job #2257635) | Borderou de evaluare (job #2862015) | Borderou de evaluare (job #2098677) | Cod sursa (job #3361387)
#include <bits/stdc++.h>
using namespace std;
#define USE_STD_IO 0
#if USE_STD_IO
#define fin cin
#define fout cout
#else
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
#endif
struct Muchie {
int vec, cost;
};
vector<Muchie> gr[15002];
int n,m, q, i, j;
int tata[15002], tRan[15002];
int niv[15002], lg[15002];
int jmp[18][15002];
int maJmp[18][15002];
vector<array<int, 3>> mch;
static inline void Swap(int& a, int& b) {
if(a == b) return;
a ^= b;
b ^= a;
a ^= b;
}
static inline int Tata(int a) {
if(a == tata[a]) return a;
return tata[a] = Tata(tata[a]);
}
int Unire_cost;
static inline bool Unire(int a, int b) {
a = Tata(a);
b = Tata(b);
if(a == b) return false;
if(tRan[a] < tRan[b]) Swap(a, b);
if(tRan[a] == tRan[b]) tRan[a]++;
tata[b] = a;
gr[a].push_back({b, Unire_cost});
gr[b].push_back({a, Unire_cost});
return true;
}
static inline void DFS(int nod) {
for(Muchie cur : gr[nod]) {
if(0 == niv[cur.vec]) {
niv[cur.vec] = niv[nod] + 1;
jmp[0][cur.vec] = nod;
maJmp[0][cur.vec] = cur.cost;
DFS(cur.vec);
}
}
}
int main() {
#if USE_STD_IO
ios_base::sync_with_stdio(false);
#endif
fin.tie(NULL);
fout.tie(NULL);
fin >> n >> m >> q;
for(i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
mch.push_back({c, x, y});
}
for(i = 1; i <= n; i++) {
tata[i] = i;
tRan[i] = 1;
}
sort(mch.begin(), mch.end());
for(const array<int, 3>& cur : mch) {
Unire_cost = cur[0];
Unire(cur[1], cur[2]);
}
DFS(1);
for(i = 2; i <= n; i++) lg[i] = 1 + lg[i >> 1];
for(i = 1; i <= lg[n]; i++) {
for(j = 1; j <= n; j++) {
jmp[i][j] = jmp[i - 1][jmp[i - 1][j]];
maJmp[i][j] = max(maJmp[i - 1][j], maJmp[i - 1][jmp[i - 1][j]]);
}
}
while(0 < q--) {
int x, y;
fin >> x >> y;
if(x == y) {
fout << "0\n";
continue;
}
int nx = niv[x], ny = niv[y];
if(nx < ny) {
Swap(x, y);
Swap(nx, ny);
}
int dif = nx - ny;
int ma = 0;
while(0 < dif) {
int k = lg[dif];
ma = max(ma, maJmp[k][x]);
x = jmp[k][x];
dif = niv[x] - ny;
}
if(x == y) {
fout << ma << '\n';
continue;
}
for(i = lg[n]; 0 <= i; i--) {
if(0 != jmp[i][x] && jmp[i][x] != jmp[i][y]) {
if(ma < maJmp[i][x]) ma = maJmp[i][x];
if(ma < maJmp[i][y]) ma = maJmp[i][y];
x = jmp[i][x];
y = jmp[i][y];
}
}
if(ma < maJmp[0][x]) ma = maJmp[0][x];
if(ma < maJmp[0][y]) ma = maJmp[0][y];
fout << ma << '\n';
}
return 0;
}