Pagini recente » Cod sursa (job #407820) | Cod sursa (job #678201) | Cod sursa (job #496840) | Cod sursa (job #2387262) | Cod sursa (job #2675375)
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MMAX 30000
#define NMAX 15000
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n,M,k;
vector<int > adj[NMAX+5];
int dad[NMAX+5],rang[NMAX+5],grad[NMAX+5],l[NMAX+5];
struct edge
{
int x,y,c;
};
edge m[MMAX+5];
bool cmpedge(edge a,edge b)
{
return a.c<b.c;
}
int root(int node)
{
if(dad[node]==0)
return node;
return root(dad[node]);
}
void unite(int r,int p,int cost)
{
if(rang[r]>rang[p])
{
rang[r]+=rang[p];
dad[p]=r;
l[p]=cost;
adj[r].pb(p);
}
else
{
rang[p]+=rang[r];
dad[r]=p;
l[r]=cost;
adj[p].pb(r);
}
}
void dfs(int node)
{
for(auto x:adj[node])
{
grad[x]=grad[node]+1;
dfs(x);
}
}
int main()
{
f>>n>>M>>k;
for(int i=1; i<=M; i++)
{
f>>m[i].x>>m[i].y>>m[i].c;
}
sort(m+1,m+M+1,cmpedge);
for(int i=1; i<=n; i++)
{
dad[i]=0;
rang[i]=1;
}
int nr=0;
for(int i=1; i<=M; i++)
{
int rx=root(m[i].x);
int ry=root(m[i].y);
if(rx!=ry)
{
unite(rx,ry,m[i].c);
nr++;
}
//cout<<rx<<" "<<ry<<'\n';
}
for(int i=1; i<=n; i++)
{
if(dad[i]==0)
{
dad[i]=i;
dfs(i);
}
}
for(int i=1; i<=k; i++)
{
int x,y;
f>>x>>y;
int maxim=0;
if(grad[x]>grad[y])
{
swap(x,y);
}
while(grad[y]>grad[x])
{
maxim=max(maxim,l[y]);
y=dad[y];
}
while(x!=y)
{
maxim=max(maxim,l[x]);
maxim=max(maxim,l[y]);
x=dad[x];
y=dad[y];
}
g<<maxim<<'\n';
}
}