Pagini recente » Cod sursa (job #2980133) | Cod sursa (job #2479103) | Cod sursa (job #1259771) | Cod sursa (job #1480666) | Cod sursa (job #2351332)
#include <bits/stdc++.h>
#define Nmax 15005
#define Mmax 30005
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct edge
{
int a, b, len;
int pos;
};
bool qx(edge a, edge b)
{
return a.len < b.len;
}
edge E[Mmax], Q[Nmax];
int N, M, K;
int T[Nmax];
int ans[Nmax];
int find(int node)
{
if(node == T[node])
return node;
return T[node] = find(T[node]);
}
void unite(int A, int B)
{
A = find(A);
B = find(B);
if(A != B)
T[A] = B;
}
int main()
{
fin >> N >> M >> K;
for(int i = 1; i <= M; i++)
fin >> E[i].a >> E[i].b >> E[i].len;
for(int i = 1; i <= K; i++)
fin >> Q[i].a >> Q[i].b, Q[i].pos = i;
sort(E + 1, E + M + 1, qx);
for(int bit = 30; bit >= 0; bit--)
{
for(int i = 1; i <= N; i++)
T[i] = i;
for(int i = 1; i <= K; i++)
Q[i].len += (1 << bit);
sort(Q + 1, Q + K + 1, qx);
int j = 1;
for(int i = 1; i <= K; i++)
{
while(j <= M && E[j].len <= Q[i].len)
unite(E[j].a, E[j].b), j++;
if(find(Q[i].a) == find(Q[i].b))
Q[i].len -= (1 << bit);
}
}
for(int i = 1; i <= K; i++)
ans[Q[i].pos] = Q[i].len + 1;
for(int i = 1; i <= K; i++)
fout << ans[i] << "\n";
return 0;
}