b_역사_1613

source www.acmicpc.net/problem/1613%C2%A0
type 📌 개발노트
topics 600-알고리즘 & 코딩테스트 614 그래프
types 문제풀이
정답여부 성공

생각

모순이 없다 == 사이클이 없다로 이해.
그러면 위상정렬을 써도 되는것아닌가 ?
ㄴㄴ 안됨 이처럼 쪼개질시 쪼개진 노드끼리는 서순을 구분할 수 없음
Pasted image 20240216101645.png

아래 코드 1번파트에서 한방향 말고 좌우 방향 다 고려해야하는것아니냐?
Pasted image 20240216102426.png 사실 이 절반만 계산한다면 양방향체크해야하는게맞는데 여기서는걍 다체크해서 상관없음.

bfs 냐 걍 dfs 쓰면되는거아님?
맞음 근데 문제가 많아질수록 계속 처음부터구해야해서 복잡도가 늘어날것임.

import sys
import math

n,m = map(int, sys.stdin.readline().split())
arr = [[0]*(n+1) for _ in range(n+1)]

for _ in range(m):
    [a,b]=list(map(int, sys.stdin.readline().split()))
    arr[a][b]=-1
    arr[b][a]=1

for i in range(1,n+1):
# <span id="중간-간선-선정"></span>중간 간선 선정
    for j in range(1,n+1):
        for k in range(1,n+1):
        # 돌면서 중간 간선을 일방향 통행으로 되는것을 고름
        if(arr[j][i] == -1 and arr[i][k] == -1): # 1번파트
            arr[j][k]=-1
            arr[k][j]=1

z = int(sys.stdin.readline().strip())
question = [list(map(int, sys.stdin.readline().split())) for _ in range(z)]

for i in question:
    [a,b]=i
    print(arr[a][b])