def cut_nodes(graph):
recursionlimit = getrecursionlimit()<EOL>setrecursionlimit(max(len(graph.nodes())*<NUM_LIT:2>,recursionlimit))<EOL>if '<STR_LIT>' == graph.__class__.__name__:<EOL><INDENT>return _cut_hypernodes(graph)<EOL><DEDENT>pre = {}    <EOL>low = {}    <EOL>reply = {}<EOL>spanning_tree = {}<EOL>pre[None] = <NUM_LIT:0><EOL>for each in graph:<EOL><INDENT>if (each not in pre):<EOL><INDENT>spanning_tree[each] = None<EOL>_cut_dfs(graph, spanning_tree, pre, low, [], each)<EOL><DEDENT><DEDENT>for each in graph:<EOL><INDENT>if (spanning_tree[each] is not None):<EOL><INDENT>for other in graph[each]:<EOL><INDENT>if (low[other] >= pre[each] and spanning_tree[other] == each):<EOL><INDENT>reply[each] = <NUM_LIT:1><EOL><DEDENT><DEDENT><DEDENT>else:<EOL><INDENT>children = <NUM_LIT:0><EOL>for other in graph:<EOL><INDENT>if (spanning_tree[other] == each):<EOL><INDENT>children = children + <NUM_LIT:1><EOL><DEDENT><DEDENT>if (children >= <NUM_LIT:2>):<EOL><INDENT>reply[each] = <NUM_LIT:1><EOL><DEDENT><DEDENT><DEDENT>setrecursionlimit(recursionlimit)<EOL>return list(reply.keys())<EOL>
Return the cut-nodes of the given graph.

A cut node, or articulation point, is a node of a graph whose removal increases the number of
connected components in the graph.

@type  graph: graph, hypergraph
@param graph: Graph.

@rtype:  list
@return: List of cut-nodes.