Pagini recente » Cod sursa (job #9340) | Cod sursa (job #2684130) | Cod sursa (job #211220) | Cod sursa (job #2568995) | Cod sursa (job #2394377)
#include <bits/stdc++.h>
#define DMAX 15010
#define LMAX 20
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct nume{
int x,c;
};
struct nume2{
int y,x,c;
};
vector < vector<nume> > V;
vector < vector<nume> > arb;
vector < vector<nume> > trans;
priority_queue <nume2> heap;
bool uz[DMAX];
int M[DMAX][LMAX];
int h[DMAX];
int n,m,k,cate,hmax;
inline bool operator<(nume2 x,nume2 y){
return x.c>y.c;
}
inline int maxim(int x,int y){
if(x>y)
return x;
return y;
}
void citire();
void prim();
void dfs(int node);
int lca(int x,int y);
int main(){
int i,x,y,node,a,b,aux,kk;
citire();
prim();
memset(uz,0,sizeof(uz));
dfs(1);
while(k--)
{fin>>a>>b;
fout<<lca(a,b)<<'\n';
}
return 0;
}
void citire(){
int i,x,y,cost;
fin>>n>>m>>k;
V.resize(n+5);
arb.resize(n+5);
trans.resize(n+5);
for(i=1;i<=m;i++)
{fin>>x>>y>>cost;
V[x].push_back({y,cost});
V[y].push_back({x,cost});
}
}
void prim(){
int i,j;
nume2 var;
uz[1]=true;
for(i=0;i<V[1].size();i++)
heap.push({1,V[1][i].x,V[1][i].c});
for(i=2;i<=n;i++)
{while(uz[heap.top().x])
heap.pop();
var=heap.top();
uz[var.x]=true;
arb[var.y].push_back({var.x,var.c});
trans[var.x].push_back({var.y,var.c});
for(j=0;j<V[var.x].size();j++)
if(!uz[V[var.x][j].x])
heap.push({var.x,V[var.x][j].x,V[var.x][j].c});
}
}
void dfs(int node){
int i;
uz[node]=true;
for(i=0;i<arb[node].size();i++)
if(!uz[arb[node][i].x])
{h[arb[node][i].x]=h[node]+1;
hmax=maxim(hmax,h[arb[node][i].x]);
dfs(arb[node][i].x);
}
}
int lca(int x,int y){
int i,j,dist=0;
if(h[x]>h[y])
{int aux;
aux=x;
x=y;
y=aux;
}
while(h[x]<h[y])
{dist=maxim(dist,trans[y][0].c);
y=trans[y][0].x;
}
while(x!=y)
{dist=maxim(dist,trans[x][0].c);
x=trans[x][0].x;
dist=maxim(dist,trans[y][0].c);
y=trans[y][0].x;
}
return dist;
}