Pagini recente » Cod sursa (job #3226915) | Cod sursa (job #344383) | Cod sursa (job #2626298) | Cod sursa (job #1678070) | Cod sursa (job #3144835)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
vector<pair<int, int> > x[15001], v[15001];
int rmq[18][100001], d[20001], dp[15][20001], T[20001], sol[20001];
int niv[20001], pa[20001], k, log2[100001];
int R(int a)
{if(a==T[a])return a;
else return T[a]=R(T[a]);
}
void L(int a, int b)
{if(T[a]<T[b])T[b]=T[a];
else T[a]=T[b];
}
struct Data{
int i, j, c;
bool operator <(const Data &other) const
{if(c>other.c)return 0;
else return 1;
}
}y[30001];
void DFS(int nod, int n)
{niv[nod]=n, pa[nod]=++k, rmq[0][k]=nod;
vector<pair<int, int> >:: iterator I;
for(I=x[nod].begin();I<x[nod].end();I++)
if(niv[I->first]==0)
{DFS(I->first, n+1);
rmq[0][++k]=nod;
}
}
int Query(int a, int b)
{int l=log2[b-a+1];
if(niv[rmq[l][a-1+(1<<l)]]<niv[rmq[l][b]])return rmq[l][a-1+(1<<l)];
else return rmq[l][b];
}
void DFS1(int nod, int n)
{niv[nod]=n;
while(v[nod].empty()!=1)
{int l=log2[n-niv[v[nod].back().first]+1], v1;
v1=max(dp[l][n], dp[l][niv[v[nod].back().first]-1+(1<<l)]);
sol[v[nod].back().second]=max(sol[v[nod].back().second], v1);
v[nod].pop_back();
}
vector<pair<int, int> >:: iterator I;
for(I=x[nod].begin();I<x[nod].end();I++)
if(niv[I->first]==0)
{d[n+1]=I->second;
dp[1][n+1]=I->second;
for(int i=2;i<=log2[n+1];i++)
dp[i][n+1]=0;
for(int i=2;i<=log2[n+1];i++)
dp[i][n+1]=max(dp[i-1][n+1], max(dp[i-1][n+1-(1<<(i-1))], d[n+2-(1<<(i-1))]));
DFS1(I->first, n+1);
}
}
int main()
{ int n, m, q, a, b, r;
fin>>n>>m>>q;
for(int i=1;i<=m;i++)
fin>>y[i].i>>y[i].j>>y[i].c;
sort(y+1, y+1+m);
for(int i=1;i<=n;i++)
T[i]=i;
for(int i=1;i<=m;i++)
{int a1=R(y[i].i), b1=R(y[i].j);
if(a1!=b1)
{L(a1, b1);
x[y[i].i].push_back({y[i].j, y[i].c});
x[y[i].j].push_back({y[i].i, y[i].c});
}
}
for(int i=2;i<=100000;i++)
log2[i]=log2[i/2]+1;
DFS(1, 1);
for(int i=1;i<=log2[k];i++)
for(int j=(1<<i);j<=k;j++)
if(niv[rmq[i-1][j-(1<<(i-1))]]<niv[rmq[i-1][j]])rmq[i][j]=rmq[i-1][j-(1<<(i-1))];
else rmq[i][j]=rmq[i-1][j];
for(int i=1;i<=q;i++)
{fin>>a>>b;
r=Query(pa[a], pa[b]);
v[a].push_back({r, i});
v[b].push_back({r, i});
}
fill(niv+1, niv+1+n, 0);
DFS1(1, 1);
for(int i=1;i<=q;i++)
fout<<sol[i]<<"\n";
return 0;
}