Let $P$ be the set of pairs of vertices that need to communicate and let $n$ be the number of vertices of the graph.
Compute the block-cut tree $T$ of your graph and root it in an arbitrary vertex.
Remove from $P$ all pairs that belong in the same block.
For any vertex $v$ of the graph, let $b_v$ be the vertex of $T$ representing the block in which $v$ belongs.
For each of the surviving pairs $(u,v) \in P$, compute the lowest common ancestor $LCA(b_u, b_v)$ of $b_u$ and $b_v$ in $T$. This requires $O(n + |P|)$ time using, e.g., Tarjan's algorithm.
For every pair $(u,v) \in P$, the cut vertices that disconnect $u$ from $v$ are exactly those that appear in the (unique) path of $T$ from $b_u$ to $LCA(b_u, b_v)$ or in the (unique) path of $T$ from $b_v$ to $LCA(b_u, b_v)$.
These vertices can be found efficiently by visiting $T$ in postorder. While visiting a vertex $x$, keep track of a special vertex $s_x$. This vertex might not always exist, but if it does it will always be an ancestor of $x$. The meaning of $s_x$ is the following: all cut-vertices in the path from $x$ to $s_x$ disconnect at least one pair in $P$.
The visit of a generic vertex $x$ proceeds as follows:
- Let $x_1, x_2, \dots$ be the children of $x$ in $T$, and set $s_x$ to the vertex of lowest depth in $T$ among $s_{x_1}, s_{x_2}, \dots$, if any.
- If $x$ represents a block $B$:
- 2.1. For each pair $(u,v) \in P$ such that $\{u,v\} \cap B \neq \emptyset$, set $s_x$ to the lowest vertex among $s_x$ itself (if $s_x$ exists) and $LCA(u,v)$.
- If $x$ is a cut-vertex, $s_x$ exists, and $x$ is a descendant of $s_x$ (a vertex is a descendant of itself):
- 3.1. Report $x$ as a cut-vertex disconnecting a pair of interest.
Step 1 requires time proportional to the number of children of $x$ in $T$, therefore the total time spent in this step will be $O(n)$.
The overall time required to perform step 2 is $O(n+|P|)$ after a $O(|P|)$ preprocessing that associates the pairs in $P$ to the corresponding blocks.
Finally, step 3. requires constant time per vertex (since the ancestor-descendant relation can be checked in constant time after a $O(n)$ preprocessing).