// We do not need to define Q either, as we will loop over each vertex anyway, and the order does not matter.
vector<pair<int,double>>top_actors;// Each pair is (actor_index, farness).
top_actors.reserve(k+1);// We need exactly k items, no more and no less.
vector<bool>enqueued(MAX_ACTOR_ID,false);// Vector to see which vertices with put in the queue during the BSF
// We loop over each vertex
for(constauto&[actor_id,actor]:A){
// if |Top| ≥ k and L[v] > Farn[Top[k]] then return Top; => We can not exploit the lower bound of our vertex to stop the loop, as we are not updating lower bounds L.
// We just compute the farness of our vertex using a BFS
queue<pair<int,int>>q;// FIFO of pairs (actor_index, distance from our vertex).
for(size_ti=0;i<enqueued.size();i++)
enqueued[i]=false;
intr=0;// |R|, where R is the set of vertices reachable from our vertex
longlongintsum_distances=0;// Sum of the distances to other nodes
intprev_distance=0;// Previous distance, to see when we get to a deeper level of the BFS
q.push(make_pair(actor_id,0));
enqueued[actor_id]=true;
boolskip=false;
while(!q.empty()){
auto[bfs_actor_id,distance]=q.front();
q.pop();
// Try to set a lower bound on the farness
if(top_actors.size()==k&&distance>prev_distance){// We are in the first item of the next exploration level
// We assume r = A.size(), the maximum possible value
if(!A.count(actor_id))// The actor must exist, otherwise A[actor_id] would attempt to write A, and this may produce a race condition if multiple threads do it at the same time
continue;
// if |Top| ≥ k and L[v] > Farn[Top[k]] then return Top; => We can not exploit the lower bound of our vertex to stop the loop, as we are not updating lower bounds L.
// We just compute the farness of our vertex using a BFS
queue<pair<int,int>>q;// FIFO of pairs (actor_index, distance from our vertex).
for(size_ti=0;i<enqueued.size();i++)
enqueued[i]=false;
intr=0;// |R|, where R is the set of vertices reachable from our vertex
longlongintsum_distances=0;// Sum of the distances to other nodes
intprev_distance=0;// Previous distance, to see when we get to a deeper level of the BFS
q.push(make_pair(actor_id,0));
enqueued[actor_id]=true;
bool skip=false;
while (!q.empty()){
auto[bfs_actor_id,distance]=q.front();
q.pop();
// Try to set a lower bound on the farness
if(distance>prev_distance){
constlock_guard<mutex>top_actors_lock(top_actors_mutex);// Acquire ownership of the mutex, wait if another thread already owns it. Release the mutex when destroyed.
if(top_actors.size()==k){// We are in the first item of the next exploration level
// We assume r = A.size(), the maximum possible value
// Insert the actor in top_actors, before the first element with farness >= than our actor's (i.e. sorted insert)
constlock_guard<mutex>top_actors_lock(top_actors_mutex);// Acquire ownership of the mutex, wait if another thread already owns it. Release the mutex when destroyed.