Pagini recente » Cod sursa (job #378555) | Cod sursa (job #760997) | Cod sursa (job #2965414) | Cod sursa (job #1850654) | Cod sursa (job #1802251)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct graf
{
int x,y,c;
};
graf gf[15005];
int n, m, k, T[15005], rang[15005], Cost[15005], Use[15005];
void Read()
{
f>>n>>m>>k;
for(int i = 1; i <= m; i++)
{
f>>gf[i].x>>gf[i].y>>gf[i].c;
}
}
inline bool Comp(graf a, graf b)
{
return a.c<b.c;
}
inline int caut(int a)
{
while(a!=T[a]) a = T[a];
return a;
}
inline void Unite(int a, int b, int c)
{
if(rang[a]<rang[b])
{
T[a] = b;
Cost[a] = c;
}
else
{
T[b] = a;
Cost[b] = c;
}
if(rang[a] == rang[b]) rang[a]++;
}
void arbmin()
{
for(int i = 1; i <= n; i++) T[i] = i;
sort(gf+1,gf+1+m,Comp);
for(int i = 1; i <= m; i++)
{
int a = caut(gf[i].x);
int b = caut(gf[i].y);
if(a!=b)
{
Unite(a, b, gf[i].c);
}
}
//for(int i = 1; i<=n; i++) cout<<T[i]<<' ';
}
inline 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;
}
inline int GetMax(int a, int b)
{
int cost = 0;
while(a!=b)
{
cost = max(cost,Cost[a]);
a = T[a];
//cout<<a<<b<<'\n';
}
return cost;
}
inline int Query(int a, int b, int p)
{
int l = LCA(a,b,p);
//cout<<l<<'\n';
return max(GetMax(a,l), GetMax(b,l));
}
void Solve()
{
arbmin();
while(k--)
{
int a, b;
f>>a>>b;
g<<Query(a,b,k)<<'\n';
}
}
int main()
{
Read();
Solve();
return 0;
}