Computer >> 컴퓨터 >  >> 프로그램 작성 >> 프로그램 작성

강력하게 연결된 구성 요소에 대한 Tarjan 알고리즘


Tarjan's Algorithm은 방향 그래프의 강하게 연결된 구성 요소를 찾는 데 사용됩니다. 이 알고리즘을 구현하려면 단 한 번의 DFS 순회만 필요합니다.

강력하게 연결된 구성 요소에 대한 Tarjan 알고리즘

DFS 탐색을 사용하여 숲의 DFS 트리를 찾을 수 있습니다. DFS 트리에서 강력하게 연결된 구성 요소를 찾습니다. 그러한 하위 트리의 루트가 발견되면 전체 하위 트리를 표시할 수 있습니다. 그 하위 트리는 강력하게 연결된 구성 요소 중 하나입니다.

입력 및 출력

입력:그래프의 인접 행렬.0 0 1 1 01 0 0 0 00 1 0 0 00 0 0 10 0 0 0 0출력:강하게 연결된 구성 요소:431 2 0

알고리즘

findComponent(u, 디스크, 낮음, 스택, stackItemFlag)

입력: 시작 노드, 발견 시간, 낮음, 디스크는 정점의 발견 시간을 보유하고 낮음은 하위 트리에 대한 정보를 보유합니다. 정점을 보유할 스택과 스택에 있는 노드를 추적하기 위한 또 다른 플래그 배열입니다.

출력: SCC를 표시합니다.

시작 시간 :=0 //시간 값은 다음 함수 호출을 위해 초기화되지 않습니다. set disk[u] :=time+1 and low[u] :=time + 1 time :=time + 1 push u 스택으로 stackItemFalg[u] :=u에 인접한 모든 정점 v에 대해 true, v가 발견되지 않으면 수행 fincComponent(v, disk, low, stack, stackItemFalg) low[u] =low[u]의 최소값 그리고 low[v] 그렇지 않으면 stackItemFalg[v]가 true이면 low[u] :=low[u]의 최소값이고 disk[v]는 poppedItem:=0이면 low[u] =디스크[u]이고, 반면 u는 스택 맨 위에 있지 않습니다. do poppedItem :=스택 맨 위 표시 poppedItem stackItemFlag[poppedItem] :=스택의 false 팝 항목 완료 poppedItem :=스택 맨 위 표시 poppedItem stackItemFlag[poppedItem] :=stackEnd의 false 팝 항목 

strongConComponent(그래프)

입력 &,마이너스; 주어진 그래프.

출력 - 강력하게 연결된 모든 구성 요소.

처음에 디스크 배열의 모든 항목을 낮은 φ에서 φ까지의 모든 요소에 대해 발견되지 않은 것으로 설정하고 그래프의 모든 노드 i에 대해 스택에 항목이 저장되지 않은 것으로 표시하고 디스크[i]가 발견되지 않으면 findComponent( i, 디스크, 로우, 스택, stackItemFlag)End

#include#include#define NODE 5 using namespace std; 정수 그래프[노드][노드] ={ {0, 0, 1, 1, 0}, {1, 0, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0 , 0, 0, 1}, {0, 0, 0, 0, 0}}; int min(int a, int b) { return (a&stk, bool stkItem[]) { 정적 정수 시간 =0; 디스크[u] =낮음[u] =++시간; //초기 발견 시간 및 낮은 값은 1 stk.push(u); stkItem[u] =참; // 스택에서 u로 플래그 for(int v =0; v stk; for(int i =0; i 

출력

431 2 0