하나의 컴포넌트(connected component)로 구성되어 있는 그래프에서 특정 정점을 제거할 때, 컴포넌트의 개수가 증가하는 정점을 단절점 이라고 한다.
DFS 트리를 이용하면 단절점을 빠르게 구할 수 있다.
(DFS 트리: 임의의 그래프에서 DFS를 돌면서 방문 순서대로 노드의 번호를 매기며 생성되는 트리)
DFS 트리에서 단절점의 판별볍은 다음과 같다.
현재 정점보다 먼저 방문했던 정점에 갈 수 있는지 확인하는 것은 Tarjan’s Algorithm을 사용하면 된다.
int n, m;
vector<int> adj[10'001];
int ord[10'001];
int idx = 1;
bool isCut[10'001];
int dfs(int cur)
{
ord[cur] = idx++;
int ret = ord[cur];
int ccnt = 0;
for(int nxt: adj[cur]){
if(ord[nxt]){
ret = min(ret, ord[nxt]);
continue;
}
else{
int low = dfs(nxt);
ret = min(ret, low);
ccnt++;
if(ord[cur] != 1 && ord[cur]<=low) isCut[cur] = true;
}
}
if(ord[cur] == 1 && ccnt>=2) isCut[cur] = true;
return ret;
}