Pagini recente » Cod sursa (job #1525082) | Cod sursa (job #1667271) | Cod sursa (job #1035460) | Cod sursa (job #2433319) | Cod sursa (job #1028113)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
struct muchie
{
int x, y;
long long d;
}u[30010];
struct cmp
{
bool operator()(const muchie &a, const muchie &b)
{
return a.d < b.d;
}
};
int n, m, T;
int par[15010], krpar[15010], h[15010];
long long cost[15010];
void citire();
void kruskal();
void solve();
int getroot(int x);
bool comun(int x, int y);
void reuniune(muchie mu);
void krset();
long long drum(int x, int y);
int main()
{
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
citire();
kruskal();
solve();
return 0;
}
void citire()
{
scanf("%d%d%d", &n, &m, &T);
for(int i = 0; i < m; i++)
scanf("%d%d%lld", &u[i].x, &u[i].y, &u[i].d);
sort(u, u+m, cmp());
}
void kruskal()
{
krset();
int i, j = 0;
for(i = 1; i < n; i++)
{
while(comun(u[j].x, u[j].y) && j < m)
j++;
reuniune(u[j]);
j++;
}
}
void krset()
{
for(int i = 0; i <= n; i++)
par[i] = krpar[i] = -1;
}
int getroot(int x)
{
if(krpar[x] == -1)
return x;
krpar[x] = getroot(krpar[x]);
return krpar[x];
}
bool comun(int x, int y)
{
return getroot(x) == getroot(y);
}
void reuniune(muchie mu)
{
int rx, ry;
rx = getroot(mu.x);
ry = getroot(mu.y);
if(rx == ry)
return;
if(h[rx] < h[ry])
swap(rx, ry);
par[ry] = rx;
krpar[ry] = rx;
cost[ry] = mu.d;
if(h[rx] == h[ry])
h[rx]++;
}
long long drum(int x, int y)
{
long long maxim = 0;
if(h[x] < h[y])
swap(x, y);
while(h[y] < h[x])
{
maxim = max(maxim, cost[y]);
y = par[y];
}
while(x != y)
{
maxim = max(maxim, max(cost[x], cost[y]));
x = par[x];
y = par[y];
}
return maxim;
}
void solve()
{
int x, y;
long long rez;
for(int i = 0; i < T; i++)
{
scanf("%d%d", &x, &y);
rez = drum(x, y);
printf("%lld\n", rez);
}
}