Pagini recente » Cod sursa (job #2990660) | Cod sursa (job #1963512) | Cod sursa (job #653384) | Cod sursa (job #1979280) | Cod sursa (job #3307644)
#include<bits/stdc++.h>
using namespace std;
typedef struct {
int u,v,cost;
} edge;
typedef struct {
int nd,cost;
} adj_elt;
const int MAXM=3e4;
const int MAXN=MAXM/2;
const int MAXLOG=20;
edge edges[MAXM+1];
int pr[MAXN+1],up[MAXLOG+1][MAXN+1],c[MAXLOG+1][MAXN+1],lvl[MAXN+1],sz[MAXN+1];
vector<adj_elt>apm_adj[MAXN+1];
bool cmp(edge a,edge b) {
return a.cost<b.cost;
}
int _find(int u) {
if(u==pr[u]) {
return u;
}
return pr[u]=_find(pr[u]);
}
bool connected(int u,int v) {
u=_find(u);
v=_find(v);
return (u==v);
}
void unite(int u,int v) {
u=_find(u);
v=_find(v);
if(u!=v) {
if(sz[u]>sz[v]) {
sz[u]+=sz[v];
pr[v]=u;
} else {
sz[v]+=sz[u];
pr[u]=v;
}
}
}
void dfs(int u,int fa=0,int co=0) {
up[0][u]=fa;
c[0][u]=co;
lvl[u]=1+lvl[fa];
for(auto v:apm_adj[u]) {
if(v.nd!=fa) {
dfs(v.nd,u,v.cost);
}
}
}
int query(int u,int v) {
int delta=abs(lvl[u]-lvl[v]);
if(lvl[u]<lvl[v]) {
swap(u,v);
}
int e=0;
for(int i=MAXLOG; i>=0; i--) {
if((delta>>i)&1) {
e=max(e,c[i][u]);
u=up[i][u];
}
}
if(u==v) {
return e;
}
for(int i=MAXLOG; i>=0; i--) {
if(up[i][u]!=0&&up[i][v]!=0&&up[i][u]!=up[i][v]) {
e=max(e,max(c[i][u],c[i][v]));
u=up[i][u];
v=up[i][v];
}
}
e=max(e,max(c[0][u],c[0][v]));
return e;
}
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int main() {
int n,m,k;
fin>>n>>m>>k;
for(int i=0; i<m; i++) {
fin>>edges[i].u>>edges[i].v>>edges[i].cost;
}
sort(edges,edges+m,cmp);
for(int i=1; i<=n; i++) {
pr[i]=i;
sz[i]=1;
}
for(int i=0; i<m; i++) {
if(!connected(edges[i].u,edges[i].v)) {
unite(edges[i].u,edges[i].v);
apm_adj[edges[i].v].push_back({edges[i].u,edges[i].cost});
apm_adj[edges[i].u].push_back({edges[i].v,edges[i].cost});
}
}
dfs(1);
for(int i=1; i<=MAXLOG; i++) {
for(int j=1; j<=n; j++) {
up[i][j]=up[i-1][up[i-1][j]];
c[i][j]=max(c[i-1][j],c[i-1][up[i-1][j]]);
}
}
while(k--) {
int u,v;
fin>>u>>v;
fout<<query(u,v)<<'\n';
}
return 0;
}