Pagini recente » Cod sursa (job #1601454) | Cod sursa (job #2673192) | Cod sursa (job #1609038) | Cod sursa (job #1866770) | Cod sursa (job #1958549)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct muchie
{
int x,y,c;
};
vector <int> Sol;
vector <pair <int,int> > L;
vector <pair <int,int> > Arb[15005];
int N,M,TT[15005],R[15005],CostX,B,E[100][15005],Maxedge[100][15005],maxe,K,Level[15005],Log[15005];
bool Use[15005];
muchie V[30005];
void Read()
{
fin>>N>>M>>K;
for(int i=1;i<=M;i++)
{
fin>>V[i].x>>V[i].y>>V[i].c;
}
for(int i=1;i<=K;i++)
{
int a,b;
fin>>a>>b;
L.push_back(make_pair(a,b));
}
}
int compare(muchie a,muchie b)
{
return (a.c < b.c);
}
int Father(int nod)
{
while(nod!=TT[nod])
{
nod=TT[nod];
}
return nod;
}
void Unite(int x,int y)
{
if(R[y]>R[x])
TT[x]=y;
else
TT[y]=x;
if(R[x]==R[y])
R[x]++;
}
void APM()
{
sort(V+1,V+M+1,compare);
for(int i=1;i<=N;i++)
{
TT[i]=i;
}
for(int i=1;i<=M;i++)
{
int X = Father(V[i].x);
int Y = Father(V[i].y);
if(X != Y)
{
Unite(X,Y);
Sol.push_back(i);
}
}
for(int i=0;i<(int)Sol.size();i++)
{
Arb[V[Sol[i]].x].push_back(make_pair(V[Sol[i]].y,V[Sol[i]].c));
Arb[V[Sol[i]].y].push_back(make_pair(V[Sol[i]].x,V[Sol[i]].c));
}
}
void DFS(int Nod)
{
Use[Nod]=1;
for(int i = 0; i < (int)Arb[Nod].size(); ++i)
{
int Vecin = Arb[Nod][i].first;
int Cost = Arb[Nod][i].second;
if(Use[Vecin]==0)
{
E[0][Vecin]=Nod;
Maxedge[0][Vecin]=Cost;
Level[Vecin] = Level[Nod] + 1;
DFS(Vecin);
}
}
}
void Precalculate()
{
DFS(1);
for(int i = 2; i <= N; ++i)
Log[i] = Log[i/2] + 1;
for(int i = 1; (1<<i) <= N; ++i)
{
for(int j = 1; j <= N; ++j)
{
E[i][j] = E[i-1][E[i-1][j]];
Maxedge[i][j]=max(Maxedge[i-1][j],Maxedge[i-1][E[i-1][j]]);
}
}
}
int LCA(int x, int y)
{
if(Level[x] < Level[y])
swap(x,y);
while(Level[x]!=Level[y])
{
int K = Log[Level[x]-Level[y]];
x = E[K][x];
}
if(x == y)
return x;
for(int K = Log[Level[x]]; K >= 0 ; K--)
{
if(E[K][x] != E[K][y])
{
x = E[K][x];
y = E[K][y];
}
}
return E[0][x];
}
void findmax(int Nod,int stramos)
{
while(Nod!=stramos )
{
int a=Log[Level[Nod]-Level[stramos]];
maxe=max(maxe,Maxedge[a][Nod]);
Nod=E[a][Nod];
}
}
void Solve()
{
for(int i=0;i<K;i++)
{
int Q;
maxe=0;
Q=LCA(L[i].first,L[i].second);
findmax(L[i].first,Q);
findmax(L[i].second,Q);
fout<<maxe<<"\n";
}
}
int main()
{
Read();
APM();
Precalculate();
Solve();
return 0;
}