ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithm] - 위상 정렬
    Algorithm/Algorithm 2022. 9. 1. 22:26

    위상 정렬


    방향 그래프에서 간선으로 주어진 정점 간 선후 관계를 위배하지 않도록 나열하는 정렬
    싸이클이 존재하는 경우는 발생할 수 없다

     

    • 일반적으로 방향그래프로 설정이 되어 있기 때문에 Indegree 값이 0인 Node들에서 먼저 시작하면서 VFS 처럼 구현하면 된다.
    • 위상 정렬의 결과가 Node들의 수와 동일해야 한다! ( 동일하지 않는 경우는 Cycle이 발생된 경우 )

     

    알고리즘

    시간 복잡도 : O( V+E )

    1. 처음 방향 그래프들의 Edge를 읽으며, Indegree Table을 설정

    2. Indegree가 0인 Node들을 Queue에 넣는다.

    3. Queue에 Node들을 꺼내며, 위상 정렬 값 추가

    4. 연결된 Node들의 Indgree값을 줄여주고 , 0이면 Queue에 추가

    5. 3~4반복

    # 위상 정렬
    # 그래프를 사용
    # Indgree의 값을 보고 판단
    '''
    7 7
    A B
    D B
    C B
    C D
    D E
    E F
    G E
    '''
    import sys
    from collections import deque
    input = sys.stdin.readline
    
    n , m = map ( int , input().split() )
    adj = [ [] for _ in range( m ) ]
    indgree = [0]*m
    queue = deque()
    answer = []
    
    for _ in range( n ) :
        start , end = map ( str , input().split() )
        adj[ord(start)-65].append(ord(end)-65)
        indgree[ord(end)-65] += 1
    
    for index , graph in enumerate(indgree) :
        if not graph :
            queue.append(index)
    
    while ( queue ) :
        temp = queue.popleft()
        answer.append(chr(temp+65))
        for data in adj[temp] :
            indgree[data] -= 1
            if not indgree[data] :
                queue.append(data)
    
    print (answer)

     

    BOJ 2252번 - 줄 세우기


    • 선후관계 처리가 필요함에 따라 위상 정렬로 풀어야 한다.
    # BOJ 2252번 - 줄 세우기
    # Idea - 두 학생의 키를 보고 정렬 시켜야 한다.
    # Edge = 선후 관계 -> 위상 정렬
    
    import sys
    from collections import deque
    input = sys.stdin.readline
    
    n , m = map( int , input().split() )
    adj = [[] for _ in range( n+1 )]
    indegree = [0] * (n+1)
    queue = deque()
    answer = []
    
    for _ in range( m ) :
        small , big = map ( int , input().split() )
        adj[small].append(big)
        indegree[big] += 1
    
    for index , data in enumerate ( indegree[1:] ) :
        if not data :
            queue.append(index+1)
    
    while ( queue ) :
        temp = queue.popleft()
        answer.append(temp)
        for data in adj[temp] :
            indegree[data] -= 1
            if not indegree[data] :
                queue.append(data)
        
    [print(temp) for temp in answer]

     

    프로그래머스 - 순위


    • 위상정렬 문제인듯 보이지만, 단순 그래프 구현 문제이다.

     

    'Algorithm > Algorithm' 카테고리의 다른 글

    [Algorithm] - 정렬  (0) 2022.09.02
    [Algorithm] - DP  (0) 2022.09.01
    [Algorithm] - HEAP(우선 순위 QUEUE)  (1) 2022.09.01
    [Algorithm] - 다익스트라  (0) 2022.08.31
    [Algorithm] - Graph( Node / Edge/ BFS / DFS )  (0) 2022.08.30

    댓글

Designed by Tistory.