Pagini recente » Cod sursa (job #2591606) | Cod sursa (job #1909793) | Cod sursa (job #3288333) | Cod sursa (job #1429330) | Cod sursa (job #3275263)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct edge{
int a,b,c;
};
vector<pair<int,int>> apm[15005];
vector<edge> edges;
int sizee[15005],rep[15005],lift[20][15005],minedge[20][15005],father[15005],level[15005];
bool compare(edge x, edge y)
{
return x.c<y.c;
}
int find(int x)
{
if(!rep[x])
return x;
return rep[x]=find(rep[x]);
}
void unionn(int x, int y)
{
if(sizee[x]>sizee[y])
swap(x,y);
rep[x]=y, sizee[y]+=sizee[x];
}
void dfs(int x)
{
for(auto i:apm[x])
if(i.first!=father[x])
{
father[i.first]=lift[0][i.first]=x, minedge[0][i.first]=rep[i.first]=i.second;
level[i.first]=level[x]+1;
dfs(i.first);
}
}
void get_ancestors(int x)
{
int p=1;
while(level[x]-(1<<p)>=0)
{
lift[p][x]=lift[p-1][lift[p-1][x]];
minedge[p][x]=max(minedge[p-1][x],minedge[p-1][lift[p-1][x]]);
p++;
}
for(auto i:apm[x])
if(i.first!=father[x])
get_ancestors(i.first);
}
int binary_lifting(int x, int y)
{
int maxx=0;
if(level[x]<level[y])
swap(x,y);
int lg=log2(level[x]+1);
for(int i=lg;i>=0&&level[x]!=level[y];i--)
if(level[x]-(1<<i)>level[y])
{
maxx=max(maxx,minedge[i][x]);
x=lift[i][x];
}
if(father[x]==y)
return max(maxx,rep[x]);
if(level[x]!=level[y]){
x=father[x];
maxx=max(maxx,rep[x]);}
for(int i=lg;i>=0;i--)
{
if(lift[i][x]==0||lift[i][x]==lift[i][y])
continue;
maxx=max(maxx,max(minedge[i][x],minedge[i][y]));
x=lift[i][x], y=lift[i][y];
}
return max(maxx,max(rep[x],rep[y]));
}
int main()
{
int n,m,k;
f>>n>>m>>k;
for(int i=1;i<=m;i++)
{
int a,b,c;
f>>a>>b>>c;
edges.push_back({a,b,c});
}
sort(edges.begin(),edges.end(),compare);
for(int i=1;i<=n;i++)
sizee[i]=1;
for(auto i:edges)
{
int x=find(i.a), y=find(i.b);
if(x==y)
continue;
apm[i.a].push_back({i.b,i.c});
apm[i.b].push_back({i.a,i.c});
unionn(x,y);
}
dfs(1);
get_ancestors(1);
while(k--)
{
int x,y;
f>>x>>y;
g<<binary_lifting(x,y)<<'\n';
}
return 0;
}