Pagini recente » Cod sursa (job #1046137) | Cod sursa (job #2526467) | Cod sursa (job #1746400) | Cod sursa (job #1535700) | Cod sursa (job #3170637)
#include <fstream>
#include <algorithm>
#include <vector>
#define NMAX 15000
#define MMAX 30000
#define LOG 20
using namespace std;
ifstream cin ("radiatie.in");
ofstream cout ("radiatie.out");
struct ura
{
int x, y, c;
};
ura edges[MMAX + 10];
int boss[NMAX + 10], cnt[NMAX + 10], level[NMAX + 10], ancestor[LOG + 10][NMAX + 10], costMax[LOG + 10][NMAX + 10], n, m, q;
vector <pair <int, int>> graph[NMAX + 10];
bool cmp(struct ura &a, struct ura &b)
{
if (a.c < b.c)
return true;
return false;
}
int finalBoss(int node)
{
if (node == boss[node])
return node;
else
return boss[node] = finalBoss(boss[node]);
}
void join(int node1, int node2)
{
node1 = finalBoss(node1);
node2 = finalBoss(node2);
if (cnt[node1] < cnt[node2])
{
cnt[node2] = cnt[node2] + cnt[node1];
boss[node1] = node2;
}
else
{
cnt[node1] = cnt[node1] + cnt[node2];
boss[node2] = node1;
}
}
void findMST()
{
for (int node = 1; node <= n; node++)
{
boss[node] = node;
cnt[node] = 1;
}
sort(edges + 1, edges + m + 1, cmp);
for (int i = 1; i <= m; i++)
if (finalBoss(edges[i].x) != finalBoss(edges[i].y))
{
join(edges[i].x, edges[i].y);
graph[edges[i].x].push_back({edges[i].y, edges[i].c});
graph[edges[i].y].push_back({edges[i].x, edges[i].c});
}
}
void dfs(int node, int parent, int cost)
{
level[node] = level[parent] + 1;
ancestor[0][node] = parent;
costMax[0][node] = cost;
for (const auto &it : graph[node])
if (it.first != parent)
dfs(it.first, node, it.second);
}
int query(int x, int y)
{
if (level[x] < level[y])
swap(x, y);
int diff = level[x] - level[y];
int ans = 0;
for (int p = LOG; p >= 0; p--)
if (diff >> p & 1)
{
ans = max(ans, costMax[p][x]);
x = ancestor[p][x];
}
if (x == y)
return ans;
for (int p = LOG; p >= 0; p--)
if (ancestor[p][x] != 0 && ancestor[p][y] != 0 && ancestor[p][x] != ancestor[p][y])
{
ans = max(ans, max(costMax[p][x], costMax[p][y]));
x = ancestor[p][x];
y = ancestor[p][y];
}
ans = max(ans, max(costMax[0][x], costMax[0][y]));
return ans;
}
int main()
{
cin >> n >> m >> q;
for (int i = 1; i <= m; i++)
cin >> edges[i].x >> edges[i].y >> edges[i].c;
findMST();
dfs(1, 0, 0);
for (int p = 1; p <= LOG; p++)
for (int node = 1; node <= n; node++)
{
ancestor[p][node] = ancestor[p - 1][ancestor[p - 1][node]];
costMax[p][node] = max(costMax[p - 1][node], costMax[p - 1][ancestor[p - 1][node]]);
}
for (int i = 1; i <= q; i++)
{
int x, y;
cin >> x >> y;
cout << query(x, y) << '\n';
}
return 0;
}