algorithm/Algorithm-Core

절단선 찾기 vs 싸이클 찾기

아르비스 2018. 8. 23. 23:14

절단점 찾는 알고리즘과 싸이클 찾은 알고리즘은 둘다 DFS방식을 이용하지만, 미묘하게 다르다..

뭐가 다를까?.


절단선 = 단절선. (Bridge : 단절선)


int dfs(int A, int parent) : A와 A의 자식 노드가 A에서 parent노드로 가는 간선을 사용하지 않고 도달할 수 있는 정점 중 가장 먼저 dfs함수가 방문한 정점을 반환한다.


<절단선 찾기>

static int dfs(int s, int p, int d) {  // start, parent, depth

D[s]=d;

int ck = d;

for (Object des : list[s]) {

Node nd = (Node)des;

if(nd.e==p) continue;

if(D[nd.e]==0) {

int re = dfs(nd.e, s, d+1);

if(re>D[s]) {

res.add(nd.id);

}

ck = Math.min(re, ck);

} else {

ck = Math.min(ck, D[nd.e]);

}

}

return ck;

}




< 싸이클 찾기 > 

private static void dfs(int idx) { vis[idx] = true; int next = s[idx]; if (!vis[next]) { p[next] = idx; dfs(next); } else { if (!fin[next]) { cycle(idx, s[idx]); } } fin[idx] = true; } private static void cycle(int idx, int next) { cnt++; if (idx == next) return; cycle(p[idx], next); 

 




<절단점 찾기 전체 소스>


< 싸이클 찾기 전체 소스 >



<단절점 찾기 >

1. int dfs(int A, bool isRoot) : A의 자식 노드가 A를 거치지 않고 도달할 수 있는 정점 중 가장 먼저 dfs함수가 방문한 정점을 반환한다.

isRoot는 정점 A가 루트노드인지를 나타냅니다.


2. 정점 i가 DFS탐색에서 발견된 순서 : discovered[i]


3. 정점 i가 절단점인지 여부 : isCutVertex[i]

단절점이란 그 정점을 제거했을 때, 그래프가 두 개 또는 그 이상으로 나누어지는 정점을 말한다. 

 >  root이면서 child가  2개 이상인 경우