Pagini recente » Cod sursa (job #2472337) | Cod sursa (job #2056359) | Cod sursa (job #1121676) | Cod sursa (job #2854014) | Cod sursa (job #2138628)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
const int NMax=15005;
int N,M,k,T[NMax],R[NMax],Cost[NMax],Use[NMax];
struct muchie
{
int x,y,c;
};
muchie E[2*NMax];
void Read()
{
fin>>N>>M>>k;
for(int i=1;i<=M;++i)
{
fin>>E[i].x>>E[i].y>>E[i].c;
}
}
inline bool Comp(muchie a, muchie b)
{
return a.c<b.c;
}
int Root(int a)
{
while(a!=T[a])
{
a = T[a];
}
return a;
}
inline void Unite(int a, int b, int c)
{
if(R[a]<R[b])
{
T[a]=b;
Cost[a]=c;
}
else
{
T[b]=a;
Cost[b]=c;
}
if(R[a] == R[b])
{
R[a]++;
}
}
void arbore()
{
for(int i=1; i<=N; ++i)
{
T[i] = i;
}
sort(E+1,E+M+1,Comp);
for(int i=1; i<=M; i++)
{
int a=Root(E[i].x);
int b=Root(E[i].y);
if(a!=b)
{
Unite(a,b,E[i].c);
}
}
}
int LCA(int a, int b, int p)
{
while(T[a]!=a)
{
Use[a]=p;
a=T[a];
}
while(T[b]!=b && Use[b]!=p)
{
b = T[b];
}
return b;
}
int GetMax(int a, int b)
{
int cost=0;
while(a!=b)
{
cost=max(cost,Cost[a]);
a=T[a];
}
return cost;
}
int Query(int a, int b, int p)
{
int l=LCA(a,b,p);
return max(GetMax(a,l), GetMax(b,l));
}
void Solve()
{
arbore();
for(;k>0;k--)
{
int a, b;
fin>>a>>b;
fout<<Query(a,b,k)<<'\n';
}
}
int main()
{
Read();
Solve();
return 0;
}