Pagini recente » Cod sursa (job #1616406) | Cod sursa (job #2537279) | Cod sursa (job #818873) | Cod sursa (job #2469418) | Cod sursa (job #2354455)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
const int N=15005;
const int LOG=18;
int s[LOG+2][N],rad[LOG+2][N],nr[N],t[N],n,nrm,k;
struct muchie
{
int x,y,cost;
};
vector<muchie>v;
bool cmp(muchie x,muchie y)
{
return(x.cost<y.cost);
}
int radacina(int x)
{
if(t[x]==0)
return x;
t[x]=radacina(t[x]);
return t[x];
}
void reuniune(int x,int y)
{
int rx=radacina(x);
int ry=radacina(y);
if(nr[rx]<nr[ry])
{
t[rx]=ry;
nr[ry]+=nr[rx];
nr[rx]=0;
}
else
{
t[ry]=rx;
nr[rx]+=nr[ry];
nr[ry]=0;
}
}
bool aceeasi(int x,int y)
{
return(radacina(x)==radacina(y));
}
vector<int>a[N],c[N];
void apm(int x)
{
for(int i=1;i<=x;i++)
{
nr[i]=1;
t[i]=0;
}
sort(v.begin(),v.end(),cmp);
for(unsigned i=0;i<v.size();i++)
if(!aceeasi(v[i].x,v[i].y))
{
reuniune(v[i].x,v[i].y);
a[v[i].x].push_back(v[i].y);
a[v[i].y].push_back(v[i].x);
c[v[i].x].push_back(v[i].cost);
c[v[i].y].push_back(v[i].cost);
}
}
int h[N];
bool viz[N];
void dfs(int x)
{
int y,cost;
for(unsigned i=0;i<a[x].size();i++)
{
y=a[x][i];
cost=c[x][i];
if(!viz[y])
{
viz[y]=true;
s[0][y]=x;
rad[0][y]=cost;
h[y]=1+h[x];
dfs(y);
}
}
}
void query(int x,int y)
{
int p,sol=0;
if(h[x]<h[y])
swap(x,y);
int h1=h[x];
int h2=h[y];
p=LOG;
while(h1>h2)
{
if(h1-(1<<p)>=h2)
{
sol=max(sol,rad[p][x]);
x=s[p][x];
h1-=1<<p;
}
p--;
}
p=LOG;
while(s[0][x]!=s[0][y])
{
if(s[p][x]!=s[p][y])
{
sol=max(sol,max(rad[p][x],rad[p][y]));
x=s[p][x];
y=s[p][y];
h1-=1<<p;
h2-=1<<p;
}
p--;
}
if(x!=y)
sol=max(sol,max(rad[0][x],rad[0][y]));
out<<sol<<'\n';
}
int main()
{
int x,y,cost;
muchie m;
in>>n>>nrm>>k;
for(int i=1;i<=nrm;i++)
{
in>>x>>y>>cost;
m.x=x;
m.y=y;
m.cost=cost;
v.push_back(m);
}
apm(n);
h[1]=0;
s[0][x]=0;
viz[1]=true;
dfs(1);
for(int i=1;i<=LOG;i++)
for(int j=1;j<=n;j++)
{
s[i][j]=s[i-1][s[i-1][j]];
rad[i][j]=max(rad[i-1][j],rad[i-1][s[i-1][j]]);
}
for(int i=1;i<=k;i++)
{
in>>x>>y;
query(x,y);
}
return 0;
}