Pagini recente » Statistici Miruna Petcan (noRoom4us) | Istoria paginii runda/info_test_2/clasament | Autentificare | Fence | Cod sursa (job #3195280)
#include <bits/stdc++.h>
#define N_MAX 15005
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct muchie
{
int x, y, cost;
} v[2 * N_MAX];
int tata[N_MAX], lng[N_MAX], niv[N_MAX], d[N_MAX];
bool viz[N_MAX];
vector<int> l[N_MAX];
int n, m, radacina_finala;
bool compara(muchie a, muchie b)
{
return a.cost < b.cost;
}
int getroot(int x)
{
while (tata[x] != x)
x = tata[x];
return x;
}
void join(int a, int b, int c)
{
a = getroot(a);
b = getroot(b);
if (lng[a] < lng[b])
swap(a, b);
tata[b] = a;
lng[a] += lng[b];
d[b] = c;
l[a].push_back(b);
radacina_finala = a;
}
void dfs(int nod, int nv)
{
viz[nod] = true;
niv[nod] = nv;
for (int i = 0; i < l[nod].size(); i++)
{
int fiu = l[nod][i];
if (!viz[fiu])
{
dfs(fiu, nv + 1);
}
}
}
int LCA(int x, int y)
{
int maxim_x = 0, maxim_y = 0;
if (niv[x] < niv[y])
swap(x, y);
while (niv[x] != niv[y])
{
maxim_x = max(maxim_x, d[x]);
x = tata[x];
}
while (x != y)
{
maxim_x = max(maxim_x, d[x]);
maxim_y = max(maxim_y, d[y]);
x = tata[x];
y = tata[y];
}
return max(maxim_x, maxim_y);
}
int main()
{
int t;
fin >> n >> m >> t;
for (int k = 1; k <= m; k++)
{
int i, j, cost;
fin >> i >> j >> cost;
v[k] = {i, j, cost};
}
for (int i = 1; i <= n; i++)
tata[i] = i, lng[i] = 1;
sort(v + 1, v + m + 1, compara);
for (int i = 1; i <= m; i++)
{
if (getroot(v[i].x) != getroot(v[i].y))
{
join(v[i].x, v[i].y, v[i].cost);
}
}
dfs(radacina_finala, 1);
while (t--)
{
int a, b;
fin >> a >> b;
fout << LCA(a, b) << '\n';
}
}