Pagini recente » Cod sursa (job #2896554) | Cod sursa (job #582045) | Cod sursa (job #992541) | Cod sursa (job #1251946) | Cod sursa (job #1160920)
/*
Keep It Simple!
*/
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include<cstdio>
#include<algorithm>
#define MaxN 15005
#define MaxM 30005
#define MaxV(a,b) ((a)>(b)?(a):(b))
using namespace std;
struct drum
{
int x, y, c;
}roads[MaxM];
int T[MaxN];
int C[MaxN];
int Rg[MaxN];
int Level[MaxN];
int Pad[MaxN];
int N, M, K;
bool cmp(drum First, drum Second)
{
return First.c < Second.c;
}
int Find(int node)
{
int root;
for (root = node; Pad[root] != root; root = Pad[root]);
while (node != root)
{
int aux = Pad[node];
Pad[node] = root;
node = aux;
}
return root;
}
void Unite(int x, int y,int cost)
{
if (Rg[x] > Rg[y])
{
Pad[y] = x;
T[y] = x;
C[y] = cost;
Level[y] = Level[x] + 1;
}
else
{
Pad[x] = y;
T[x] = y;
C[x] = cost;
Level[x] = Level[y] + 1;
}
if (Rg[x] == Rg[y]) Rg[y]++;
}
int main()
{
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
scanf("%d%d%d", &N, &M, &K);
for (int i = 1; i <= M; i++)
scanf("%d%d%d", &roads[i].x, &roads[i].y, &roads[i].c);
sort(roads + 1, roads + M + 1, cmp);
for (int i = 1; i <= N; i++)
{
Pad[i] = i;
T[i] = i;
Rg[i] = 1;
}
for (int i = 1; i <= M; i++)
if ( Find(roads[i].x) != Find(roads[i].y))
Unite(roads[i].x, roads[i].y, roads[i].c);
int x, y;
for (int i = 1; i <= K; i++)
{
scanf("%d%d", &x, &y);
int maxvalue = -1;
while (x != y)
{
if (Level[x] > Level[y])
{
maxvalue = MaxV(maxvalue, C[x]);
x = T[x];
}
else
{
maxvalue = MaxV(maxvalue, C[y]);
y = T[y];
}
}
printf("%d\n", maxvalue);
}
}