(9) 기본 적 인 그림 알고리즘
그림 의 기 호 는 G = (V, E) 로 두 가지 데이터 구조 로 인접 링크 와 인접 행렬 을 표시 할 수 있다.
인접 링크
인접 행렬
범위 우선 검색 (BFS)
알고리즘
BFS(G, s)
/* */
for each vertex u ∈ G.V - {s}
u.color = white;
u.pr = null;
u.d = ∞;
s.color = gray;
s.pr = null;
s.d = 0;
Q = ∅; //Queue is empty;
Enqueue(Q, s);
/* */
while (Q != ∅)
u = Dequeue(Q); //take u off from queue head;
for each v of G.Adj[u]
if (v.color == white)
v.color = gray;
v.pr = u;
v.d = u.d+1;
Enqueue(Q, v); //push v into the queue tail;
u.color = black; //u's job is done;
BFS 성질: 그 알고리즘 은 임의의 결점 의 최 단 경로 거 리 를 정확하게 계산 할 수 있다.δ
(1) 최 단 경로 거리 성질: 변 (u, v) 8712 ° E, 있 음δ(s, v) ≤ δ(s, u)+1;
증명: 만약 에 s 가 u 에 도착 할 수 있 고 v 에 도착 할 수 있 으 며 변 (u, v) 이 존재 한다 면 s 에서 v 까지 의 가장 짧 은 경로 거 리 는 s 에서 u 까지 의 가장 짧 은 경로 와 변 보다 더 길 수 없다.s 가 u 에 도착 하지 못 하면,δ(s, u) = ∞, 그러면 성질 도 성립 된다.
이어서 BFS 가 계산 한 v. d 를 증명 하기 위해 =δ(s, v), 우 리 는 먼저 v. d ≥, 재 증 ≤;
(2) BFS 가 계산 한 v. d ≥δ(s, v);
증명: (수학 귀납법, 전 과정 관찰) ① 초기 화 시: for s, s. d =δ(s,s) = 0; for each v∈G.V - {s}, v.d = ∞ >= δ(s, v); ② BFS 연산 시: assume u has u. d > =δ(s, u). when u just does its dequeue, then we see that for edge(u, v), the BFS algorithm says v.d = u.d+1 ≥ δ(s, u)+1 [this is our assumption] ≥ δ(s, v) [cuz edge(u,v)exists, and we have property (1)]. And after this operation, node v's color turns gray and v.d no longer changes. Thus we prove our property(2).
(3) BFS 중대 열 에 대열 에 최대 두 개의 서로 다른 d 값 이 포함 되 어 있 고 팀 의 d 값 은 오름차 순 (v [i]. d < = v [i + 1]. d) 을 유지 합 니 다.
증명: (수학 귀납법) - 머리 조건: s 만 팀 에 있 을 때 s. d = 0 만 있 고 정리 만족;s 가 팀 을 떠 난 후에 팀 에 결점 을 추가 하 는 단계 에 추 가 된 모든 s. adj 결점 은 v. d = 1 이 고 정리 도 만족 합 니 다. 즉, v [1] 가 팀 을 떠 나 기 전에 v [r] d = v [1] d = 1 < = v [1]. d + 1 과 v [i] d = v [i + 1] d = 1 < = v [i + 1] d 를 만족 시 켰 습 니 다.원래 v [1] 가 팀 을 떠 난 후에 팀 에 새로운 결산 점 을 추가 하 는 단 계 는 모두 v. d = 원래 v [1]. d + 1 = 2 < = v [2]. d + 1 을 만족 시 킵 니 다. 우 리 는 원래 의 v [2] 를 새로운 v [1] 로 봅 니 다. 즉, v [r]. d < = 새로운 v [1]. d + 1 이 설립 되 었 습 니 다.그리고 우 리 는 현재 v [1] ~ v [k] 에 d = 1, v [k + 1] ~ v [r] 에 d = 2 가 있다 는 것 을 알 고 있 기 때문에 반드시 v [i]. d < = v [i + 1]. d 가 있다.귀납 단계: u 가 팀 을 떠 나 기 전에 정 리 는 만족 하 다 고 가정 하고 u 를 v [1], 즉 v [r]. d < = v [1]. d + 1 로 기록한다.동시에 v [i]. d < = v [i + 1]. d 도 성립 된다 고 가정 하면 v [1]. d < = v [2]. d 가 있다.
u 가 팀 에서 나 와 팀 에 요 소 를 추가 할 때 새로 가입 한 노드 마다 v. d = u. d + 1 < = 원 v [2]. d + 1 이 있 고 원 v [2] 를 새로운 v [1] 로 기록 하면 v [r]. d < = v [1] + 1 이 아직도 성립 된다.두 번 째 가설 을 보고 대열 의 원래 부분 에 대해 계속 성립 한다.대기 열 에 원래 와 새로운 부분 이 교차 하 는 곳 에 대해 원래 v [r]. d < = 원 v [1]. d + 1 < = 원 v [2] + 1, 현재 새로 가입 한 v = u + 1 = 원 v [1]. d + 1 > = 원 v [r]. d 를 알 고 있 기 때문에 인수 부분 도 v [i] < = v [i + 1] 가 성립 됩 니 다.그리고 새로운 추가 부분 에 대해 서 는 v [i] = v [i + 1] 이 있 고 v [i] < = v [i + 1] 에 부합 합 니 다.종합 적 으로 초기 조건 과 귀납 단계 가 모두 성립 되 기 때문에 정리 가 성립 된다.
(4) BFS 가 구 한 v. d =δ(s, v) 모든 v * 8712 ° V 는 s 가 BFS 알고리즘 을 통 해 발견 한 결점, 즉 s 가 모든 v 에 도달 할 수 있다 는 것 을 알 고 있 습 니 다.
증명: (반증 법) v. d 가 존재 한다 고 가정 합 니 다! =δ(s, v), v. d > =δ(s, v) 정리, v. d >δ(s,v); 그러면 이러한 존 재 는 두 가지 상황 이 있 습 니 다. 그림 에 일부 결점 이 있 는 v. d >δ(s, v) 그림 의 모든 노드 에 v. d > 가 있 거나δ(s, v). - 후 자 는 분명히 불가능 하 다. 왜냐하면 적어도 변 (s - > a) 은 a 결점 을 a. d = 에 만족 시 킬 수 있 기 때문이다.δ(s, a); --전자의 상황 을 보면 s 가 출발 하 는 한 경로 에서 u 이전의 결점 은 정상 이 고 v 부터 뒤의 결점 은 모두 v. d > 가 나 타 났 다.δ(s, v) 그 유일한 가능성 은 결점 v 가 다른 더 짧 은 경로 로 연결 되 었 기 때 문 입 니 다. 이 때 는 BFS 알고리즘 이 가장 짧 은 경로 보다 더 빨리 추진 되 었 다 는 것 을 의미 합 니 다. 그들의 머리 는 모두 회색 입 니 다. 이것 은 대열 d 값 과 같은 시간 에 두 개 만 유지 하 는 것 과 모순 입 니 다. - - 이렇게 증명 할 수 있 습 니 다. s 에서 v 까지 의 가장 짧 은 경로 에서 앞의 결점 은 x 입 니 다.그러면 x. d =δ(s, x), 그리고δ(s, v) = δ(s, x) + 1 (이것 이 가장 짧 은 경로 라 고 명 확 히 밝 혔 습 니 다), v. d >δ(s, v) = δ(s, x) + 1 = x. d + 1. 이것 은 바로 우리 가 상술 한 v 가 더 긴 경로 에서 먼저 탐색 되 는 문제 이다. 우 리 는 x 탐색 의 측면 에서 볼 때 왜 이것 이 불가능 한 지 알 아 보 자. 만약 에 x 에서 v 를 탐색 할 때 v 가 흰색 이 라면 v. d = x. d + 1, 모순;만약 에 v 가 검은색 이 고 이때 x 가 회색 이 라면 v 가 x 보다 먼저 팀 을 나 가 야 한 다 는 것 이다. 그러면 v. d < = x. d, 모순;만약 에 v 가 회색 이 라면 v 는 특정한 결점 u 에 의 해 먼저 탐색 되 었 을 것 이다. 그러면 u 는 x 보다 먼저 대열 에 들 어가 u. d < = x. d 를 만족 시 켰 다. 그러면 v. d = u. d + 1 < = x. d + 1, 모순;종합 하면 BSF 알고리즘 에서 감지 할 수 있 는 모든 노드 v, v. d =δ(s, v) 반드시 성립 된다.
깊이 우선 검색
DFS(G) {
/* */
for each vertex u in G.V
u.color = white
u.pr = null;
time = 0 //init time;
for each vertex u in G.V
if (u.color == white)
DFS-Visit(G, u);
}
DFS-Visit(G, u) {
time = time+1;
u.d = time;
u.color = gray;
for each v of G.Adj[u]
if v.color == white
v.pr = u
DFS-Visit(G, v);
u.color = black;
time = time+1;
u.f = time;
}
- : Θ(V);
- , Θ(V); vertex , Edge , Θ(E);
- Θ(V+E);
DFS 의 중요 성
토폴로지 정렬
Topological-sort(G)
count finish time for each vertex using DFS(G);
once a vertex is finished (marked black), insert it into the linkedList;
return the linkedList
증명: (반증 법) 링 이 있 으 면 u - > v 도 있 고 v - > u 도 있다. 그러면 토폴로지 에서 u 결점 이 v 앞 에 있 는 것 을 만족 시 킬 수 없고 v 결점 이 u 앞 에 있 는 것 을 만족 시 켜 갈등 을 형성 할 수 없다.
증명: 우리 알고리즘 의 두 번 째 행사 반환 서열 은 종료 시간 f 의 역순 에 따라 배열 되 기 때문에 만약 에 변 (u, v) 이 G 그림 에 존재 한다 면 u. f > v. f 가 성립 된다 는 것 을 증명 하면 된다.(분류 토론) DFS 성질 중 변 의 분 류 를 이용 하여 G 에 존재 하 는 임의의 변 (u, v) 에 대해 토론 한다. 만약 에 이 변 이 DFS 에서 탐색 되 었 을 때 (1) v 결점 이 회색 이면 후 향 변 이 고 주어진 방향 무 환 도 조건 과 모순 (후 향 변 회 형 고리) 이 있 기 때문에 존재 할 수 없다.(2) 만약 에 v 결점 이 흰색 이 라면 이것 은 나무 옆 이 고 흰색 경로 로 정리 되 며 v 는 u 의 자 결점 이 고 괄호 화 정리 로 u. f > v. f 를 알 고 명제 가 성립 된다.(3) 만약 에 v 결점 이 검은색 이 라면 이것 은 전방 향 변 또는 가로 변 이다. 이때 v 결점 은 시간 도장 을 찍 었 고 u 가 끝나 지 않 았 다. 그러면 u. f > v. f 가 성립 되 고 명제 도 성립 된다.따라서 전제조건 이 무 환 도 에 성립 되면 TS 알고리즘 은 항상 토폴로지 순 서 를 생 성 할 수 있다.
강 한 연결 분량 (Strongly connected components)
Strongly-connected-components(G)
1. call DFS(G) to compute finish time for each vertex in the graph;
2. compute G (reverse the direction of all edges);
3. call DFS(G), but from latest finish time to earliest at the main loop;
4. the trees that formed by second DF, are the components we look for;
정확성 증명:
(1) C 와 C ', 만약 u - > u' 가 있다 면 v '- > v 가 있 을 수 없다. 만약 에 실현 할 수 있다 면 이 두 가지 분량 의 임 의 요소 가 서로 상대방 에 게 도달 할 수 있 기 때문에 C 와 C' 는 한 분량 으로 합 칠 수 있다.
(2) C 와 C, u - > u 가 있다 면 f (C) 는 f (C) 입 니 다.
증명: (분류 토론) DFS 가 C 의 x 노드 에서 시작 하면 마지막 으로 x. f > max {Cnodes. f} 이면 f (C) > f (C);DFS 가 C '의 y 노드 에서 먼저 시작 하면 먼저 visit C' 의 결산 점 이 고 C '가 C 에 도착 하지 못 한 후에 DFS 가 C 에 대해 연산 을 시작 하면 f (C) > f (C) 를 얻 을 수 있 습 니 다.G 에 대해 동 리 는 성립 된다.
(3) SCC 알고리즘 은 G 를 얻 을 수 있다.
증명: 각 구 한 분량 을 n 개의 결점 으로 볼 수 있 습 니 다. 만약 에 알고리즘 세 번 째 줄 에서 G 에 대해 DFS 연산 을 하면 n 개의 독립 된 나무 가 충분 한 숲 을 형성 할 수 있다 면 알고리즘 은 정확 합 니 다. 수학 귀납법: 알고리즘 세 번 째 줄 의 조작 은 토폴로지 순서 (C. f > C '. f, C 앞) 에 따라 n 개의 결점 에 대해 DFS 를 진행 하 는 것 입 니 다. 여기 서 G 중의 모든 변 이 역방향 이 되 었 음 을 주의 하 십시오.
a. n = 1 일 때 숲 은 나무 한 그루 만 있 고 명제 가 성립 된 것 이 분명 하 다.b. n > 1 이 라 고 가정 할 때 일반적으로 토폴로지 순서 중의 C 와 C '에 대해 C 에 대해 DFS 를 먼저 진행 하면 C 는 토폴로지 순서 의 다음 결점 C' (G 에서 C - > C ', 그러나 이미 역방향 되 었 다) 가 없 기 때문에 C 는 단독으로 나무 가 되 었 고 DFS 는 C 에서 의 연산 은 C' 에 대해 어떠한 조작 도 하지 않 습 니 다. 이런 식 으로 유추 하면 알고리즘 은 n 개의 독립 된 나 무 를 연속 으로 생 성 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.