Pagini recente » Cod sursa (job #2334099) | Cod sursa (job #1782838) | Cod sursa (job #1917951) | Cod sursa (job #563400) | Cod sursa (job #524833)
Cod sursa(job #524833)
# include <fstream>
# include <iostream>
# include <algorithm>
# include <vector>
# include <set>
# define DIM 15003
# define pb push_back
# define mp make_pair
# define INF 2000000000
# define max(a,b) (a>b?a:b)
using namespace std;
int n, m, Q, t[16][DIM], c[16][DIM], d[DIM], v[DIM], niv[DIM];
vector< pair<int,int> >G[DIM];
set< pair <int,int> >S;
ifstream fin ("radiatie.in");
void read ()
{
fin>>n>>m>>Q;
int x, y, c;
for(int i=1;i<=m;++i)
{
fin>>x>>y>>c;
G[x].pb(mp(y,c));
G[y].pb(mp(x,c));
}
}
void apm ()
{
for(int i=2;i<=n;++i)
c[0][i]=INF;
v[1]=1;
S.insert( mp(0,1) );
int k;
while (S.size()>0)
{
k=S.begin()->second;
v[k]=1;
S.erase(S.begin());
for(int i=0;i<G[k].size();++i)
if (!v[G[k][i].first] && G[k][i].second<c[0][G[k][i].first])
{
niv[G[k][i].first]=niv[k]+1;
t[0][G[k][i].first]=k;
c[0][G[k][i].first]=G[k][i].second;
S.insert(mp(G[k][i].second,G[k][i].first));
}
}
}
void constr ()
{
int cont;
for(int i=1;cont;++i)
{
cont = 0;
for(int j=2;j<=n;++j)
if (t[i-1][t[i-1][j]])
{
cont=1;
t[i][j]=t[i-1][t[i-1][j]];
c[i][j]=max(c[i-1][j],c[i-1][t[i-1][j]]);
}
}
}
int dmm (int x, int y)
{
int a, b, rez=-1, mij, cont=1;
if (niv[x]<niv[y])a=x, b=y;
else a=y, b=x;
if (niv[a]==niv[b])cont=0;
while (cont)
{
if (niv[t[0][b]]==niv[a])
rez=max(rez,c[0][b]), b=t[0][b], cont=0;
else
{
mij=15;
while (!t[mij][b] || niv[t[mij][b]]<=niv[a])
mij/=2;
rez=max(rez,c[mij][b]);
b=t[mij][b];
}
}
if (a==b)cont=0;
else cont=1;
while (cont)
{
if(t[0][a]==t[0][b])
rez=max(rez,max(c[0][a],c[0][b])), cont = 0;
else
{
mij=15;
while (mij && (!t[mij][a] || t[mij][a]==t[mij][b]))
mij/=2;
rez=max(rez,max(c[mij][a],c[mij][b]));
a=t[mij][a];
b=t[mij][b];
}
}
return rez;
}
void solve ()
{
freopen("radiatie.out", "w", stdout);
int x, y;
for(;Q--;)
{
fin>>x>>y;
printf("%d\n", dmm(x,y));
}
}
int main ()
{
read ();
apm();
constr();
solve ();
return 0;
}