Language: C++

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <string>
#include <utility>
#include <algorithm>
#include <functional>
#include <deque>
#define INF 1e9
#define MAX_V 100000
#define MAX_E 100000

using namespace std;

typedef long long ll;
typedef pair<int,int> P;

struct edge { int to; };

vector<edge> G[MAX_V];
bool used_e[MAX_V][MAX_V];
bool used_v[MAX_V];
int ord[MAX_V];
int lowlink[MAX_V];
int k = 0;
void dfs(int i) {
    used_v[i] = true;
    ord[i] = lowlink[i] = k++;
    
    for (int j = 0; j < G[i].size(); ++j) {
        edge e = G[i][j];
        if (used_e[e.to][i]) continue;
        
        if (!used_v[e.to]) {
            used_e[i][e.to] = true;
            dfs(e.to);
            lowlink[i] = min(lowlink[i], lowlink[e.to]);
        } else {
            lowlink[i] = min(lowlink[i], ord[e.to]);
        }
    }
}

int main() {
    int V, E;
    cin >> V >> E;
    for (int i = 0; i < E; ++i) {
        int s, t;
        cin >> s >> t;
        G[s].push_back(edge{t});
        G[t].push_back(edge{s});
    }
    
    dfs(0);
    
    for (int i = 0; i < V; ++i) {
        if (i == 0) {
            int children = 0;
            for (int j = 0; j < G[i].size(); ++j) {
                edge e = G[i][j];
                if (used_e[i][e.to]) children++;
            }
            if (children >= 2) cout << 0 << endl;
            continue;
        }
        
        bool is_joint = false;
        for (int j = 0; j < G[i].size(); ++j) {
            edge e = G[i][j];
            
            if (!used_e[i][e.to]) continue;
            
            if (lowlink[e.to] >= ord[i])
                is_joint = true;
        }
        if (is_joint)
            cout << i << endl;
        
    }
    
    
    
    return 0;
}



Compiler output:
/tmp/ccVbWY0r.o: in function `dfs(int)':
a.cc:(.text+0x14): relocation truncated to fit: R_X86_64_PC32 against symbol `used_v' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x1e): relocation truncated to fit: R_X86_64_PC32 against symbol `k' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x27): relocation truncated to fit: R_X86_64_PC32 against symbol `k' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x3c): relocation truncated to fit: R_X86_64_PC32 against symbol `lowlink' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x53): relocation truncated to fit: R_X86_64_PC32 against symbol `lowlink' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x6b): relocation truncated to fit: R_X86_64_PC32 against symbol `ord' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0xe2): relocation truncated to fit: R_X86_64_PC32 against symbol `used_v' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x131): relocation truncated to fit: R_X86_64_PC32 against symbol `lowlink' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x148): relocation truncated to fit: R_X86_64_PC32 against symbol `lowlink' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x16d): relocation truncated to fit: R_X86_64_PC32 against symbol `lowlink' defined in .bss section in /tmp/ccVbWY0r.o
a.cc:(.text+0x186): additional relocation overflows omitted from the output
collect2: error: ld returned 1 exit status