Pagini recente » Cod sursa (job #826766) | Cod sursa (job #2480643) | Cod sursa (job #1778366) | Cod sursa (job #146170) | Cod sursa (job #1746951)
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
struct edges
{
int a, b, c;
} v[30001];
int n, m, k;
vector<int> g[15001];
int level[15001];
bool viz[15001];
bool cmp(edges x, edges y)
{
return x.c < y.c;
}
int p[30001];
struct
{
int nod, val;
} rmq[14][15001];
void init()
{
for(int i = 1; i <= m; i++)
p[i] = i;
}
int find(int x)
{
int ans = x;
while(p[ans] != ans)
ans = p[ans];
while(p[x] != ans)
{
int tmp = p[x];
p[x] = ans;
x = tmp;
}
return ans;
}
void join(int x, int y)
{
x = find(x);
y = find(y);
p[x] = y;
}
void dfs(int nod)
{
if(viz[nod] == 0)
for(int i = 0; i < g[nod].size(); i++)
{
level[g[nod][i]] = level[nod] + 1;
dfs(g[nod][i]);
}
viz[nod] = 1;
}
int lca(int a, int b)
{
int x = level[a], y = level[b];
int diff = x - y, res = 0;
if(diff > 0)
{
int p = 14, nivel = diff;
while(p >= 0)
{
if(1 << p <= nivel)
{
res = max(res, rmq[p][a].val);
a = rmq[p][a].nod;
nivel -= 1 << p;
}
p--;
}
}
else
{
int p = 14, nivel = -diff;
while(p >= 0)
{
if(1 << p <= nivel)
{
res = max(res, rmq[p][b].val);
b = rmq[p][b].nod;
nivel -= 1 << p;
}
p--;
}
}
/// X SI Y SUNT LA AC NIVEL
int p = 14, l = 0;
while(p >= 0 && rmq[p + l][a].nod == rmq[p + l][b].nod)
{
p--;
if(rmq[p + l][a].nod != rmq[p + l][b].nod)
{
l += p;
res = max(res, max(rmq[l][a].val, rmq[l][b].val));
}
}
int val1 = rmq[0][rmq[l][a].nod].val;
int val2 = rmq[0][rmq[l][b].nod].val;
return max(max(val1, val2), res);
}
int main()
{
FILE *fin, *fout;
fin = fopen("radiatie.in", "r");
fout = fopen("radiatie.out", "w");
fscanf(fin, "%d%d%d", &n, &m, &k);
for(int i = 1; i <= m; i++)
fscanf(fin, "%d%d%d", &v[i].a, &v[i].b, &v[i].c);
sort(v + 1, v + m + 1, cmp);
init();
for(int i = 1; i <= m; i++)
{
int x = v[i].a, y = v[i].b;
if(find(x) != find(y))
{
join(x, y);
g[x].push_back(y);
rmq[0][y].nod = x;
rmq[0][y].val = v[i].c;
}
}
level[1] = 1;
dfs(1);
for(int i = 1; i <= 14; i++)
for(int j = 1; j <= n; j++)
{
rmq[i][j].nod = rmq[i - 1][rmq[i - 1][j].nod].nod;
rmq[i][j].val = max(rmq[i - 1][j].val, rmq[i - 1][rmq[i - 1][j].nod].val);
}
for(int i = 1; i <= k; i++)
{
int a, b;
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", lca(a, b));
}
return 0;
}