πŸ“’  λ°©ν–₯κ·Έλž˜ν”„

  • λ°©ν–₯κ·Έλž˜ν”„(Digraph) : λͺ¨λ“  간선이 λ°©ν–₯간선인 κ·Έλž˜ν”„

 

πŸ“’  λ°©ν–₯κ·Έλž˜ν”„ 속성

  • λͺ¨λ“  간선이 ν•œ λ°©ν–₯으둜 μ§„ν–‰ν•˜λŠ” κ·Έλž˜ν”„ G = (V,E)μ—μ„œ

    πŸ‘‰ κ°„μ„ (a,b)λŠ” a -> b λ‘œλŠ” κ°€μ§€λ§Œ, b -> a λ‘œλŠ” 가지 μ•ŠλŠ”λ‹€.
  • κ·Έλž˜ν”„ Gκ°€ λ‹¨μˆœν•˜λ‹€λ©΄ ( 즉, λ³‘λ ¬κ°„μ„ μ΄λ‚˜, 루프가 μ—†μœΌλ©΄ )

    πŸ‘‰ M <= N(N-1) 이닀.  ( 무방ν–₯κ·Έλž˜ν”„μ—μ„  M <= (N(N-1)/2 μ˜€λ‹€. )
    ( μ—¬κΈ°μ„œ M = κ°„μ„  수, N = 정점 수 이닀. )

  • μ§„μž…κ°„μ„ λ“€(in-edges)κ³Ό μ§„μΆœκ°„μ„ λ“€(out-edges)을 각각 λ³„λ„μ˜ μΈμ ‘λ¦¬μŠ€νŠΈλ‘œ λ³΄κ΄€ν•œλ‹€λ©΄, μ§„μž…κ°„μ„ λ“€μ˜ 집합과
    μ§„μΆœκ°„μ„ λ“€μ˜ 집합을 각각의 크기에 λΉ„λ‘€ν•œ μ‹œκ°„μ— 쑰사 κ°€λŠ₯ν•˜λ‹€.

λ°©ν–₯ κ·Έλž˜ν”„μ˜ μ˜ˆμ‹œ
μœ„μ— κ·Έλž˜ν”„ κΈ°μ€€μœΌλ‘œ, in-edges, out-edgesλ₯Ό ν‘œν˜„ν•˜λ©΄ μ΄λŸ°λŠλ‚Œ

 

πŸ“’  λ°©ν–₯ DFS

  • 간선듀을 주어진 λ°©ν–₯λ§Œμ„ 따라 μˆœνšŒν•˜λ„λ‘ ν•˜λ©΄, DFS 및 BFS 순회 μ•Œκ³ λ¦¬μ¦˜λ“€μ„ λ°©ν–₯κ·Έλž˜ν”„μ— νŠΉν™” κ°€λŠ₯ν•˜λ‹€.
  • λ°©ν–₯ DFS μ•Œκ³ λ¦¬μ¦˜μ—μ„œ λ„€ μ’…λ₯˜μ˜ 간선이 λ°œμƒν•œλ‹€.

    πŸ‘‰ νŠΈλ¦¬κ°„μ„ (tree edges) : νŠΈλ¦¬μ—μ„œ, DFSκ²½λ‘œμ— ν•΄λ‹Ήν•˜λŠ” κ°„μ„ 
    πŸ‘‰ ν›„ν–₯κ°„μ„ (back edges) : νŠΈλ¦¬μ—μ„œ λ‚˜μ˜ 쑰상방ν–₯으둜 그렀질 κ°„μ„ 
    πŸ‘‰ μ „ν–₯κ°„μ„ (forward edges) : νŠΈλ¦¬μ—μ„œ λ‚˜μ˜ μžμ‹μ΄ μ•„λ‹Œ, 더 μ•„λž˜ μžμ‹ μ •μ μ˜ 경우 그렀질 κ°„μ„ 
    πŸ‘‰ ꡐ차간선(cross edges) : 같은 λ ˆλ²¨μ΄λ‚˜ ν•˜μœ„λ ˆλ²¨ μ •μ λΌλ¦¬μ˜ μ—°κ²° κ°„μ„ 

  • 정점 sμ—μ„œ μΆœλ°œν•˜λŠ” λ°©ν–₯ DFS  πŸ‘‰  sλ‘œλΆ€ν„° 도달 κ°€λŠ₯ν•œ 정점듀을 κ²°μ •ν•œλ‹€.

μœ„μ— κ·Έλž˜ν”„λ₯Ό 톡해 κ·Έλ €μ§€λŠ” DFS tree

  • 도달 κ°€λŠ₯μ„±μ΄λž€ ?

    πŸ‘‰ λ°©ν–₯κ·Έλž˜ν”„ G의 두 정점 v와 u에 λŒ€ν•΄, λ§Œμ•½ G에 vμ—μ„œ u둜의 λ°©ν–₯ κ²½λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, "vλŠ” u에 λ„λ‹¬ν•œλ‹€" λ˜λŠ” "uλŠ” vλ‘œλΆ€ν„° 도달 κ°€λŠ₯ν•˜λ‹€" λ₯Ό μ˜λ―Έν•œλ‹€.
    πŸ‘‰ sλ₯Ό 루트둜 ν•˜λŠ” DFS 트리 : sλ‘œλΆ€ν„° λ°©ν–₯경둜λ₯Ό 톡해 도달 κ°€λŠ₯ν•œ 정점듀을 ν‘œμ‹œν•œ 것

κ·Έλž˜ν”„ Gμ—μ„œ μ–΄λ–€ 정점 sμ—μ„œ "도달가λŠ₯ν•œ" μ˜ˆμ‹œ

 

πŸ“’  κ°•μ—°κ²°μ„±

  • λ°©ν–₯κ·Έλž˜ν”„ G의 μ–΄λŠ 두 정점 u와 v에 λŒ€ν•΄μ„œλ‚˜ uλŠ” v에 λ„λ‹¬ν•˜λ©° vλŠ” u에 λ„λ‹¬ν•˜λ©΄

    πŸ‘‰ Gλ₯Ό κ°•μ—°κ²°(strongly connected)이라고 λ§ν•œλ‹€. 즉, μ–΄λŠ μ •μ μ—μ„œλ“ μ§€ λ‹€λ₯Έ λͺ¨λ“  정점에 도달 κ°€λŠ₯ν•˜λ‹€.

이런 λ°©ν–₯κ·Έλž˜ν”„κ°€ μžˆλ‹€ κ°€μ •ν•˜μž.

  • κ°•μ—°κ²° 검사 μ•Œκ³ λ¦¬μ¦˜

    πŸ‘‰ 1. κ·Έλž˜ν”„ G의 μž„μ˜μ˜ 정점 vλ₯Ό μ„ νƒν•œλ‹€.
    πŸ‘‰ 2. κ·Έλž˜ν”„ G의 vλ‘œλΆ€ν„° DFSλ₯Ό μˆ˜ν–‰ν•œλ‹€. ( λ°©λ¬Έλ˜μ§€ μ•Šμ€ 정점 wκ°€ μžˆλ‹€λ©΄, Falseλ₯Ό λ°˜ν™˜ν•œλ‹€. )
    πŸ‘‰ 3. κ·Έλž˜ν”„ G의 간선듀을 λͺ¨λ‘ μ—­ν–‰μ‹œν‚¨ κ·Έλž˜ν”„ G` λ₯Ό μ–»λŠ”λ‹€.
    πŸ‘‰ 4. G`의 vλ‘œλΆ€ν„° DFSλ₯Ό μˆ˜ν–‰ν•œλ‹€. ( λ°©λ¬Έλ˜μ§€ μ•Šμ€ 정점 wκ°€ μžˆλ‹€λ©΄, Falseλ₯Ό λ°˜ν™˜. 그렇지 μ•ŠμœΌλ©΄, True λ°˜ν™˜)

    μ‹€ν–‰μ‹œκ°„ = O(N + M)

 κ·Έλž˜ν”„ G와 G의 μ—­ν–‰λ°©ν–₯인 G` 에 λŒ€ν•΄ DFS μ‹€ν–‰ν•œ κ²°κ³Ό      ( 두 경우 λͺ¨λ‘ λͺ¨λ“  정점을 μ „λΆ€ λ°©λ¬Έν•œ 것을 확인 )

  • κ°•μ—°κ²°μš”μ†Œ

    πŸ‘‰ λ°©ν–₯κ·Έλž˜ν”„μ„œ 각 μ •μ μœΌλ‘œ λ‹€λ₯Έ λͺ¨λ“  μ •μ μœΌλ‘œ 도달할 수 μžˆλŠ” μ΅œλŒ€μ˜ λΆ€ κ·Έλž˜ν”„
    πŸ‘‰ DFSλ₯Ό μ‚¬μš©ν•˜μ—¬ O(N + M)μ‹œκ°„μ— 계산 κ°€λŠ₯ν•˜λ‹€.

κ°•μ—°κ²°μš”μ†Œμ˜ μ˜ˆμ‹œ. ( λ°©ν–₯κ·Έλž˜ν”„μ— 싸이클 집합을 찾아보면 λœλ‹€. ), μœ„μ— μ˜ˆμ œλŠ” κ°•μ—°κ²°μš”μ†Œκ°€ 2개

 

πŸ“’  이행적폐쇄

  • 주어진 λ°©ν–₯κ·Έλž˜ν”„ G에 λŒ€ν•΄, κ·Έλž˜ν”„ G의 이행적폐쇄(Transitive Closure)λŠ” λ‹€μŒμ„ λ§Œμ‘±ν•˜λŠ” λ°©ν–₯κ·Έλž˜ν”„ G*

    πŸ‘‰ G* λŠ” G와 λ™μΌν•œ μ •μ λ“€λ‘œ ꡬ성
    πŸ‘‰ G에 uλ‘œλΆ€ν„° v ≠ u 둜의 λ°©ν–₯κ²½λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, G*에 uλ‘œλΆ€ν„° v둜의 λ°©ν–₯간선이 μ‘΄μž¬ν•œλ‹€.
    πŸ‘‰ 더 μ‰½κ²Œ, μˆ˜ν•™μ μœΌλ‘œ,  "A -> B , B -> C 이면, A -> C"  λ₯Ό  μ˜λ―Έν•˜λŠ” 것

  • μ΄ν–‰μ νμ‡„λŠ” λ°©ν–₯κ·Έλž˜ν”„μ— κ΄€ν•œ 도달 κ°€λŠ₯μ„± 정보λ₯Ό μ œκ³΅ν•œλ‹€.

λ°©ν–₯κ·Έλž˜ν”„ G와 이행적폐쇄λ₯Ό λ§Œμ‘±ν•˜λŠ” λ°©ν–₯κ·Έλž˜ν”„ G*

  • 이행적폐쇄 계산

    πŸ‘‰ 각 μ •μ μ—μ„œ μΆœλ°œν•˜μ—¬ DFSλ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€.

    μ‹€ν–‰μ‹œκ°„ : O(N(N + M)))  πŸ‘‰ N개의 각 μ •μ μ˜ λŒ€ν•΄ * DFS

  • λŒ€μ•ˆμœΌλ‘œ, λ™μ ν”„λ‘œκ·Έλž˜λ°(DP, Dynamic Programming)을 μ‚¬μš©ν•  수 μžˆλ‹€.

    πŸ‘‰ Floyed-Warshall μ•Œκ³ λ¦¬μ¦˜ : μœ„μ—μ„œ μ„€λͺ…ν•œ,  "A -> B , B -> C 이면, A -> C"

 

πŸ“’  Floyed-Warshall 이행적폐쇄

  • 정점듀을 1,2,....n으둜 번호λ₯Ό 맀긴닀.
  • 1,2,....,k둜 번호 맀겨진 μ •μ λ“€λ§Œ 경유 μ •μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ²½λ‘œλ“€μ„ κ³ λ €ν•΄λ³Έλ‹€.

Floyed-Warshall 이행적폐쇄 μ˜ˆμ‹œ

Alg Floyed-Warshall(G)
	input a digraph G with n vertexs
    output transitive closure G* of G

Let V(1),V(2),...,V(n) be an arbitrary numbering of the vertexs of G

G(0) <- G
for k <- 1 to n				// Stopover vertex
    G(k) <- G(k-1)
    for i <- 1 to n, i ≠ k		// start vertex
        for j <- 1 to n, j ≠ i,k	// end vertex
            if(G(k-1).areAdjacent(V(i),V(k) & G(k-1).areAdjacent(V(k),V(j))
                if(!(G(k).areAdjacent(V(i),V(j))
                     G(k).insertDirectedEdge(V(i),V(j),k)
return G(n)
  • Floyed-Warshall μ•Œκ³ λ¦¬μ¦˜μ€ G의 정점듀을 V(1),....,V(n)으둜 번호 맀긴 ν›„, λ°©ν–₯κ·Έλž˜ν”„ G(0),....,G(n)을 μž‡λ‹¬μ•„ 계산

    πŸ‘‰ G(0) = G
    πŸ‘‰ G에 { V(1),....V(k) } 집합 λ‚΄μ˜ κ²½μœ μ •μ μ„ μ‚¬μš©ν•˜λŠ” V(i)μ—μ„œ V(j)둜의 λ°©ν–₯κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λ©΄ G(k)에 λ°©ν–₯κ°„μ„ 
    (V(i), V(j))λ₯Ό μ‚½μž…

  • k λ‹¨κ³„μ—μ„œ, λ°©ν–₯κ·Έλž˜ν”„ G(k-1)λ‘œλΆ€ν„° G(k)λ₯Ό 계산
  • λ§ˆμ§€λ§‰μ— G(n) = G*λ₯Ό μ–»μŒ
  • μ‹€ν–‰μ‹œκ°„ : O(n^3)

    πŸ‘‰ μ „μ œ : μΈμ ‘ν•œμ§€ μ•Œμ•„λ³΄λŠ” areAdjacent( )κ°€ O(1)μ‹œκ°„μ— μˆ˜ν–‰ ( 즉, 인접행렬 버젼일 경우 )

n = 5 인 λ°©ν–₯κ·Έλž˜ν”„ G의 Floyed-Warshall 이행적폐쇄 진행과정 μ˜ˆμ‹œ

 

πŸ“’  λ°©ν–₯ 비싸이클 κ·Έλž˜ν”„

  • λ°©ν–₯ 비싸이클 κ·Έλž˜ν”„(DAG, Directed Acyclic Graph) : λ°©ν–₯싸이클이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ°©ν–₯κ·Έλž˜ν”„
  • μ˜ˆμ‹œ

    πŸ‘‰ 클래슀 κ°„ 상속 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€
    πŸ‘‰ ꡐ과 κ°„μ˜ μ„ μˆ˜ 관계 λ“±λ“±

  • λ°©ν–₯κ·Έλž˜ν”„μ˜ μœ„μƒμˆœμ„œ(Topological Order)

    πŸ‘‰ λͺ¨λ“  i < j인 κ°„μ„  (V(i),V(j))에 λŒ€ν•΄ 정점듀을 번호둜 λ‚˜μ—΄ν•œ 것이닀.
    πŸ‘‰ μ˜ˆμ‹œ) μž‘μ—…μŠ€μΌ€μ₯΄λ§ λ°©ν–₯κ·Έλž˜ν”„μ—μ„œ μœ„μƒμˆœμ„œλŠ” μž‘μ—…λ“€μ˜ μš°μ„  d λ§Œμ‘±ν•˜λŠ” μž‘μ—… μˆœμ„œ

    κ²°λ‘  : λ°©ν–₯κ·Έλž˜ν”„κ°€ DAG 이면 πŸ‘‰ μœ„μƒμˆœμ„œλ₯Ό 가지며, κ·Έ 역도 참이닀.

DAG(Directed Acylic Graph)와 DAG의 μœ„μƒμˆœμ„œ

 

πŸ“’  μœ„μƒμ •λ ¬(Topological Sort)

  • μœ„μƒ μ •λ ¬(Topological Sort) : DAGλ‘œλΆ€ν„° μœ„μƒμˆœμ„œλ₯Ό μ–»λŠ” 절차
  • μ•Œκ³ λ¦¬μ¦˜

    πŸ‘‰ 1. topologicalSort : μ •μ μ˜ μ§„μž…μ°¨μˆ˜(in-degree)λ₯Ό μ΄μš©ν•œ 방법
    πŸ‘‰ 2. topologicalSortDFS : DFS의 νŠΉν™”λœ 방법
  • 1. topologicalSort : μ •μ μ˜ μ§„μž…μ°¨μˆ˜(in-degree)λ₯Ό μ΄μš©ν•œ 방법
Alg topologicalSort(G)
	input a digraph G with n vertexs
    output a topological ordering V(1),...,V(n) of G,
    or an indication that G has a directed cycle

Q <- empty queue
for each u ∈ G.vertexs()
    in(u) <- inDegree(u)
    if(in(u) == 0)
        Q.enqueue(u)

i <- 1		// topological number
while(!(Q.isEmpty())
    u <- Q.dequeue()
    Label u with topological number i
    i <- i + 1
    for each e ∈ G.outIncidentEdges(u)
    	w <- G.opposite(u,e)
        in(w) <- in(w) - 1
        if(in(w) == 0)
        	Q.enqueue(w)

if(i <= n)	// i = n + 1, for DAG
     write("G has a directed cycle)	// DAGκ°€ μ•„λ‹˜μ„ μ•Œλ¦¬λŠ” λ©”μ‹œμ§€ 

return


// 각 정점에 μƒˆλ‘œμš΄ 라벨을 μ •μ˜ => ν˜„μž¬ μ§„μž…μ°¨μˆ˜(inCount) : in(v) => 정점 v의 ν˜„μž¬μ˜ μ§„μž…μ°¨μˆ˜ 계산

topologicalSort : μ •μ μ˜ μ§„μž…μ°¨μˆ˜(in-degree)λ₯Ό μ΄μš©ν•œ 방법 μ˜ˆμ‹œ

 

  • 2. topologicalSortDFS : DFSλ₯Ό ν™œμš©ν•œ μœ„μƒμ •λ ¬
Alg topologicalSortDFS(G)
	input DAG G
    output topological ordering of G
    
n <- G.numVertexs()
for each u ∈ G.vertexs()
    l(u) <- Fresh
for each v ∈ G.vertexs()
    if(l(v) == Fresh)
        rTopologicalSortDFS(G,v)

=========================================

Alg rTopologicalSortDFS(G,v)	// μž¬κ·€μ  DFSλ₯Ό ν™œμš©ν•œ μœ„μƒμ •λ ¬
	input graph G, and a start vertex v of G
    output labeling of the vertexs of G
    in the connected component of v

l(v) <- Visited
for each e ∈ G.outIncidentEdges(v)
    w <- opposite(v,e)
    if(l(w) == Fresh)		// κ°„μ„  eλŠ” tree κ°„μ„ 
        rTopologicalSortDFS(G,w)

Label v with topological number n
n <- n - 1		// μ „μ—­ λ³€μˆ˜λ‘œ μ œμ–΄ν•  것이닀.

topologicalSortDFS : DFSλ₯Ό ν™œμš©ν•œ μœ„μƒ μ •λ ¬ 방법 μ˜ˆμ‹œ

 

  • μœ„μƒ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ 비ꡐ

    1. topologicalSort : μ •μ μ˜ μ§„μž…μ°¨μˆ˜λ₯Ό μ΄μš©ν•œ 버젼

    πŸ‘‰ O(N + M) μ‹œκ°„κ³Ό O(N) 곡간 μ†Œμš”
    πŸ‘‰ κ·Έλž˜ν”„ Gκ°€ DAG라면 μœ„μƒμˆœμ„œλ₯Ό 계산
    πŸ‘‰ κ·Έλž˜ν”„ G에 λ°©ν–₯싸이클이 μ‘΄μž¬ν•  경우, 일뢀 μ •μ μ˜ μˆœμœ„λ₯Ό 맀기지 μ•Šμ€ μ±„λ‘œ "정지"

    2. topologicalSortDFS : DFS ν™œμš©ν•œ 버젼

    πŸ‘‰ O(N + M) μ‹œκ°„κ³Ό O(N) 곡간 μ†Œμš”
    πŸ‘‰ κ·Έλž˜ν”„ Gκ°€ DAG라면 G의 μœ„μƒμˆœμ„œλ₯Ό 계산
    πŸ‘‰ κ·Έλž˜ν”„ G에 λ°©ν–₯싸이클이 μ‘΄μž¬ν•  경우, ν—ˆμœ„μ˜ μœ„μƒμˆœμ„œλ₯Ό 계산 = λ°©ν–₯싸이클을 λ°œκ²¬ν•˜λ„λ‘ μˆ˜μ • κ°€λŠ₯함 !!
728x90
λ°˜μ‘ν˜•

+ Recent posts