[位相位置合わせ](Phase Align)(グラフィック位置合わせ)
13242 ワード
作成日:2022年3月1日午後9:49
実装したコードはDFSを使用しています.接続のノードを探索する際に頂点(接続を切断したノード)に遭遇し、resの前に置く. 模範解答はQueueを使用した. 度リストには、各ノードの入場回数が格納される. の入場車の数は何ですか? 番ノード→3番ノードに接続されている場合、3番ノードのインバウンド回数は1となります.
1番ノード→3番ノードに接続すると、3番ノードの進入回数は1増加の2となります. は、本人のノード数を指す. アクセス数0のノードをキューに入れ、dequeを行い出力する.Dequeを行うと、そのノードに関連するノードのアクセス数が1減少します. インバウンド回数0のノードをキューに入れ、同じ操作を繰り返します.
インプリメンテーションコード
# 위상정렬(그래프 정렬)
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を使用しています.
1番ノード→3番ノードに接続すると、3番ノードの進入回数は1増加の2となります.
Reference
この問題について([位相位置合わせ](Phase Align)(グラフィック位置合わせ)), 我々は、より多くの情報をここで見つけました https://velog.io/@lsj8706/위상정렬-그래프-정렬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol