[位相位置合わせ](Phase Align)(グラフィック位置合わせ)


作成日:2022年3月1日午後9:49

インプリメンテーションコード

# 위상정렬(그래프 정렬)
import sys
sys.stdin = open("input.txt", "rt")

def adjacentVertex(v):
    l = []
    for i in range(n+1):
        if dis[v][i] == 1:
            l.append(i)
    return l

def DFS(v):
    visited[v] = 1
    adjacent = adjacentVertex(v)
    for x in adjacent:
        if visited[x] == 0:
            DFS(x)
    res.insert(0, v)

if __name__ == "__main__":
    n, m = map(int, input().split())
    dis = [[0 for _ in range(n+1)] for _ in range(n+1)]

    for i in range(m):
        a, b = map(int, input().split())
        dis[a][b] = 1
    
    visited = [0]*(n+1)
    res = []

    for i in range(1, n+1):
        if visited[i] == 0:
            DFS(i)
    
    print(res)

模範解答

import sys
from collections import deque
sys.stdin=open("input.txt", "r")
n, m=map(int, input().split())
graph=[[0]*(n+1) for _ in range(n+1)]
degree=[0]*(n+1) # 진입차수
dQ=deque()
for i in range(m):
    a, b=map(int, input().split())
    graph[a][b]=1
    degree[b]+=1
for i in range(1, n+1):
    if degree[i]==0:
        dQ.append(i)
while dQ:
    x=dQ.popleft()
    print(x, end=' ')
    for i in range(1, n+1):
        if graph[x][i]==1:
            degree[i]-=1
            if degree[i]==0:
                dQ.append(i)

差異


実装したコードはDFSを使用しています.
  • 接続のノードを探索する際に頂点(接続を切断したノード)に遭遇し、resの前に置く.
  • 模範解答はQueueを使用した.
  • 度リストには、各ノードの入場回数が格納される.
  • の入場車の数は何ですか?
  • 番ノード→3番ノードに接続されている場合、3番ノードのインバウンド回数は1となります.
    1番ノード→3番ノードに接続すると、3番ノードの進入回数は1増加の2となります.
  • は、本人のノード数を指す.
  • アクセス数0のノードをキューに入れ、dequeを行い出力する.Dequeを行うと、そのノードに関連するノードのアクセス数が1減少します.
  • インバウンド回数0のノードをキューに入れ、同じ操作を繰り返します.