데이터 구조의 그림 - 연결 분량
4010 단어 알고리즘 집합
무방 향도 에서 정점 vi 에서 정점 vj 까지 경로 가 있 으 면 vi 와 vj 가 연결된다 고 한다.만약 에 그림 에서 임의의 두 정점 사이 가 모두 연결 된다 면 이 그림 을 연통 도 라 고 부른다. 그렇지 않 으 면 이 그림 을 비 연통 도 라 고 부른다. 그 중의 극 대 연통 자 도 를 연통 분량 이 라 고 한다. 여기 서 이른바 극 대 란 서브 맵 에 포 함 된 정점 개수 가 매우 크다 는 것 을 말한다.방향 도 에서 만약 에 모든 정점 vi 와 vj 에 대해 vi 에서 vj 까지 와 vj 에서 vi 까지 모두 경로 가 있다 면 이 그림 을 강 한 연결 도 라 고 부른다.그렇지 않 으 면 그 중의 매우 강 한 연결 자 도 를 강 한 연결 분량 이 라 고 부른다.
그림 G 에 두 개의 정점 사이 에 최소한 하나의 경로 가 존재 한다 면 두 개의 정점 이 강 한 연결 (strongly connected) 이 라 고 합 니 다.그림 G 의 두 정점 에 강 한 연결 이 있 으 면 G 는 강 한 연결 그림 이 라 고 한다.비 강 연통 도 는 그림 에 대한 매우 강 한 연통 서브 맵 이 있 는데 강 한 연통 분량 (strongly connected components) 이 라 고 합 니 다.
다음 그림 에서 서브 맵 {1, 2, 3, 4} 은 하나의 강력 한 연결 분량 으로 정점 1, 2, 3, 4 두 개 에 달 할 수 있 기 때문이다.{5}, {6} 도 각각 두 개의 강 한 연결 분량 이다.
직접 정의 에 따라 양 방향 으로 교 집합 을 옮 겨 다 니 는 방법 으로 강 한 연결 분량 을 구하 고 시간 복잡 도 는 O (N ^ 2 + M) 입 니 다.더 좋 은 방법 은 Kosaraju 알고리즘 이나 Tarjan 알고리즘 입 니 다. 이들 의 시간 복잡 도 는 모두 O (N + M) 입 니 다.본 고 는 Tarjan 알고리즘 을 소개 한다.
[Tarjan 알고리즘]
Tarjan 알고리즘 은 그림 의 깊이 를 우선 검색 하 는 알고리즘 을 기반 으로 모든 강 한 연결 분량 은 검색 트 리 의 한 그루 의 트 리 입 니 다.검색 할 때 현재 검색 트 리 에서 처리 되 지 않 은 노드 를 스 택 에 추가 하고 거 슬러 올 라 갈 때 스 택 꼭대기 에서 스 택 에 있 는 노드 가 강 한 연결 분량 인지 판단 할 수 있 습 니 다.
DFN (u) 을 노드 u 검색 의 순서 번호 (시간 스탬프) 로 정의 하고 Low (u) 는 u 또는 u 의 서브 트 리 가 거 슬러 올 라 갈 수 있 는 최초의 스 택 에서 노드 의 번 호 를 정의 합 니 다.정의 에서 얻 을 수 있다.
Low(u)=Min{
DFN(u),
Low(v),(u,v) ,u v
DFN(v),(u,v) ( )
}
DFN (u) = Low (u) 일 때 u 를 뿌리 로 하 는 검색 서브 트 리 의 모든 노드 는 강력 한 연결 분량 입 니 다.
알고리즘 위조 코드 는 다음 과 같다.
tarjan(u) { DFN[u]=Low[u]=++Index // u Low Stack.push(u) // u for each (u, v) in E // if (v is not visted) // v tarjan(v) // Low[u] = min(Low[u], Low[v]) else if (v in S) // v Low[u] = min(Low[u], DFN[v]) if (DFN[u] == Low[u]) // u repeat v = S.pop // v , print v until (u== v) }
다음은 알고리즘 프로 세 스에 대한 시범 이다.
노드 1 부터 DFS 를 시작 하여 옮 겨 다 니 는 노드 를 스 택 에 넣 습 니 다.노드 u = 6 을 찾 았 을 때 DFN [6] = LOW [6] 에서 강력 한 연결 분량 을 찾 았 습 니 다.u = v 까지 스 택 을 반환 합 니 다. {6} 은 강 한 연결 분량 입 니 다.
노드 5 를 되 돌려 줍 니 다. DFN [5] = LOW [5] 를 발 견 했 습 니 다. 스 택 을 탈퇴 한 후 {5} 은 강력 한 연결 분량 입 니 다.
노드 3 을 되 돌려 노드 4 를 계속 검색 하고 4 를 스 택 에 추가 합 니 다.노드 4 방향 노드 1 이 뒤쪽 방향 이 있 고 노드 1 이 스 택 에 있 기 때문에 LOW [4] = 1.노드 6 은 이미 스 택 에서 나 왔 습 니 다. (4, 6) 은 가로 포크 이 고 3 으로 돌아 갑 니 다. (3, 4) 는 나뭇가지 옆 이기 때문에 LOW [3] = LOW [4] = 1 입 니 다.
노드 1 로 계속 돌아 가 마지막 으로 노드 2 에 접근 합 니 다.방문 변 (2, 4), 4 는 아직 스 택 에 있 기 때문에 LOW [2] = DFN [4] = 5.1 을 되 돌려 보 니 DFN [1] = LOW [1] 를 발견 하고 스 택 의 노드 를 모두 꺼 내 하나의 연결 분량 {1, 3, 4, 2} 을 구성 합 니 다.
이로써 알고리즘 이 끝났다.이 알고리즘 을 통 해 그림 의 세 개의 강 한 연결 분량 {1, 3, 4, 2}, {5}, {6} 을 구 했 습 니 다.
Tarjan 알고리즘 을 실행 하 는 과정 에서 정점 마다 한 번 씩 방문 되 었 고 스 택 에 한 번 만 드 나 들 었 으 며 각 변 에 한 번 만 접근 되 었 기 때문에 이 알고리즘 의 시간 복잡 도 는 O (N + M) 인 것 을 알 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HNOI 2010] 면양 탄 비 (LCT / 블록)i + ki 번 째 장치 가 존재 하지 않 으 면 면양 이 날 아 갑 니 다.면양 은 i 번 째 장치 에서 시작 할 때 몇 번 맞 으 면 날 아 가 는 지 알 고 싶 어 한다.게임 을 더욱 재미있게 하기 위해 Los...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.