π λ¬Έμ
μμλ λ§μ§μ νλ°©νλ¬ λμλ‘ μ¬νμ λ λ κ²μ΄λ€. μμκ° κ° λμμλ μ΄ $N$κ°μ λ§μ§μ΄ μλ€.
λμμλ λ§μ§μμ λ§μ§μΌλ‘ μ΄λν μ μλ μΌλ°©ν΅ν κΈΈμ΄ $M$κ° μκ³ , κ° κΈΈμ μ€κ°μλ κΈ°λ ν μμ μ΄ μλ€. μ΄λ€ κΈΈμ μΆλ°νλ λ§μ§κ³Ό λμ°©νλ λ§μ§μ΄ κ°μ μλ μμΌλ©°, μ¬λ¬ κΈΈμ΄ κ°μ λ§μ§μ μ°κ²°ν μλ μλ€.
μμλ λμμ λ§μ§μμ μ¬νμ μμν΄μ, κΈΈμ μ΄μ©ν΄ λ§μ§μ νλ°©νλ€ λμμ λ§μ§μμ μ¬νμ λλΌ κ²μ΄λ€. μ¬νμ μμν κ³³κ³Ό μ¬νμ λλΈ κ³³μ΄ κ°μ νμλ μλ€.
λμλ μμκ° μ¬λ λ§μμμ λ©λ¦¬ λ¨μ΄μ Έ μκΈ° λλ¬Έμ, μμλ ν λ²μ μ¬νμμ μ΅λν λ§μ λ§μ§κ³Ό μμ μ λ€λ₯΄λ €κ³ νλ€. νΉν, μ¬ν μ€μ λͺ¨λ λ§μ§μ λ°©λ¬Ένκ±°λ λͺ¨λ κΈ°λ ν μμ μ λ°©λ¬Ένλ€λ©΄ λ€μ μ¬νμμ ν μΈ ννμ λ°μ μ μκΈ° λλ¬Έμ μμλ μ΄λ° μ¬νμ΄ κ°λ₯νμ§ μκ³ μΆμ΄ νλ€. μ°λ¦¬κ° ν μΌμ, μμμ μ¬ν κ³νμ λλ κ²μ΄λ€.
πμ λ ₯
첫 λ²μ§Έ μ€μ λ§μ§μ μ $N$κ³Ό κΈΈμ μ $M$μ΄ κ³΅λ°±μΌλ‘ ꡬλΆλμ΄ μ£Όμ΄μ§λ€. $(1 \leq N, M \leq 500\,000$)
λ λ²μ§Έ μ€λΆν° $M$μ€μ κ±Έμ³ κ° κΈΈμ μ λ³΄κ° μ£Όμ΄μ§λ€. κ° μ€μλ λ μ $u$, $v$κ° κ³΅λ°±μΌλ‘ ꡬλΆλμ΄ μ£Όμ΄μ§λλ°, μ΄λ λ§μ§ $u$μμ λ§μ§ $v$λ‘ κ°λ κΈΈμ΄λΌλ κ²μ μλ―Ένλ€. (1≤ $u$, $v$ ≤ $N$)
πμΆλ ₯
μ΄ 3κ°μ μ€μ μΆλ ₯νλ€.
첫 λ²μ§Έ μ€μλ μμκ° $N$κ°μ λ§μ§μ λͺ¨λ λ°©λ¬Έν μ μλ μ¬ν κ³νμ΄ μ‘΄μ¬νλ©΄ 1μ, κ·Έλ μ§ μλ€λ©΄ 0μ μΆλ ₯νλ€.
λ λ²μ§Έ μ€μλ μμκ° $M$κ°μ κΈ°λ ν μμ μ λͺ¨λ λ°©λ¬Έν μ μλ μ¬ν κ³νμ΄ μ‘΄μ¬νλ©΄ 1μ, κ·Έλ μ§ μλ€λ©΄ 0μ μΆλ ₯νλ€.
μΈ λ²μ§Έ μ€μλ μμκ° $N$κ°μ λ§μ§μ λͺ¨λ λ°©λ¬Ένλ©΄μ, $M$κ°μ κΈ°λ ν μμ λ λͺ¨λ λ°©λ¬Έν μ μλ μ¬ν κ³νμ΄ μ‘΄μ¬νλ©΄ 1μ, κ·Έλ μ§ μλ€λ©΄ 0μ μΆλ ₯νλ€.
π λ¬Έμ νμ΄
λ¬Έμ λ₯Ό λ€μ μ 리νλ©΄
μ ν₯ κ·Έλνκ° μ£Όμ΄μ§κ³ , ν μ μμ μμνμ¬ λͺ¨λ λ Έλλ₯Ό λ°©λ¬Έν μ μλ κ²½μ°, ν μ μμ μμνμ¬ λͺ¨λ κ°μ μ μ§λκ° μ μλ κ²½μ°λ₯Ό μ°Ύλ κ²μ΄λ€.
μΈλ²μ§Έμ ꡬν΄μΌ νλ κ°μ μμ λ§ν λ μν©μ μ°Ύμ λμ AND κ΄κ³λ‘ μ μ μλ€.
κ·Έλνλ₯Ό νλ² λ¨Έλ¦¬μμΌλ‘ κ·Έλ €λ³΄μ.
λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένλλ°, λ°©λ¬Ένμ§ λͺ»νλ κ°μ μ΄ μμκΉ?
μλ€.
μλμ κ°μ μν©μ μ΄ν΄λ³΄λ©΄ 1 -> 2 -> 3 μμΌλ‘ λ°©λ¬Ένλ©΄ λͺ¨λ λ Έλλ₯Ό λ°©λ¬Έν μλ μμ§λ§ 1->3μ μλ κ°μ μ μ§λκ°μ§ λͺ»νλ€.
κ·Έλ¬λ©΄ λ°λλ‘ λͺ¨λ κ°μ μ μ§λκ°λλ°, λ°©λ¬Ένμ§ λͺ»νλ λ Έλκ° μμκΉ?
μ²μμλ μλ€κ³ μκ°νμλ€.
λͺ¨λ κ°μ μ μ§λκ°λ€λ κ²μ κ·Έ κ°μ μ΄ μκ³ μλ λ λ Έλλ₯Ό μ§λκ°λ€λ κ²μ΄κ³ , κ·Έλ κ²νλ©΄ κ·Έλνμ μλ λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένμκ±°λΌκ³ μκ°νλ€.
νμ§λ§!!
λμΉ μ μ΄ μμλ€.
κ·Έλνκ° λͺ¨λ μ°κ²°λμ΄ μμ§ μμ μλ μλ€λ μ μ΄λ€.
μ¦ μλμ κ°μ ννμ κ·Έλνκ° μ λ ₯μΌλ‘ μ£Όμ΄μ§ μ μλ€.
μ΄λ κ² λλ€λ©΄ 1μ΄λ 2μμ μμνλ©΄ λͺ¨λ κ°μ μ μ§λκ° μ μμ§λ§, λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένλ κ²μ λΆκ°λ₯νλ€!
μ΄ μ μ μκ°νμλ€λ©΄ μ΄μ μ½λμ§λ©΄ λλ€!
νμ΄λ μ°μ SCCλ₯Ό λ§λ€κ³ DAG κ·Έλνλ₯Ό μλ‘ κ·Έλ €μ£Όμλ€. κ·Έλ¦¬κ³ μ¬κΈ°μ μμμ λ ¬μ μννλ©΄μ μμμ λ ¬ κ²½λ‘κ° μ μΌνμ§ μλμ§, μμμ λ ¬ μμμ μ΄ μ μΌνμ§ μλμ§ λ±μ νμ ν΄μ£Όμλ€.
π» μ½λ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | from collections import deque import sys sys.setrecursionlimit(10**6) input = sys.stdin.readline def dfs(cur:int): global idx, num idx += 1 d[cur] = idx visited[cur] = True stk.append(cur) parent = d[cur] for nxt in graph[cur]: if d[nxt] == -1: parent = min(parent, dfs(nxt)) elif visited[nxt]: parent = min(parent, d[nxt]) if d[cur] == parent: cnt = 0 while True: node = stk.pop() visited[node] = False scc_idx[node] = num cnt += edges_cnt[node] if cur == node: break scc_node[num] = cnt num += 1 return parent def topology(dag:list[list[int]], edges:list[int]) -> list[int]: global first, second queue = deque() level = [0]*num not_one = 0 for i in range(num): if edges[i] == 0: queue.append((i,0)) if len(dag[i]) + scc_node[i] >= 1: not_one += 1 if not_one > 1: second = False if len(queue) != 1: first = False while queue: cur,dep = queue.popleft() if level[dep]: first = False level[dep] += 1 if len(dag[cur]) > 1: second = False if not first and not second: return for nxt in dag[cur]: edges[nxt] -= 1 if not edges[nxt]: queue.append((nxt, dep+1)) return n,m = map(int,input().split()) graph = [[] for _ in range(n+1)] edges_cnt = [0]*(n+1) for _ in range(m): u,v = map(int,input().split()) edges_cnt[u] += 1 graph[u].append(v) d = [-1]*(n+1) visited = [False]*(n+1) stk = [] idx = 0 num = 0 scc_idx = dict() scc_node = dict() for cur in range(1, n+1): if d[cur] == -1: dfs(cur) dag = [[] for _ in range(num)] edges = [0]*num for cur in range(1, n+1): for nxt in graph[cur]: if scc_idx[cur] != scc_idx[nxt]: dag[scc_idx[cur]].append(scc_idx[nxt]) edges[scc_idx[nxt]] += 1 first = True second = True for i in range(num): if len(dag[i]) != len(set(dag[i])): second = False break topology(dag, edges) print(+first, +second, +first&second, sep='\n') | cs |
π μνμ°©μ€
μ΄μ¬ν μΉκ³ λ°κ³ νμλ€.
μ€κ°μ λ°νμ μλ¬(Error)λ λλ¨μ΄μ Έμλ κ·Έλνκ° μ λ ₯μΌλ‘ μ£Όμ΄μ§λ μ§ νμΈνκΈ° μν¨μ΄μλ€.
π λ¬Έμ λ§ν¬
'Problem Solving > λ°±μ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€] 28357λ²: μ¬ν λλ μ£ΌκΈ° (1) | 2023.10.08 |
---|---|
[λ°±μ€] 5942λ²: Big Macs Around the World (0) | 2023.09.18 |
[λ°±μ€] 1185: μ λ½ μ¬ν (0) | 2023.08.24 |
[λ°±μ€] 28457λ²: Every? Only One's Marble - νμ΄μ¬ (0) | 2023.08.13 |
[λ°±μ€] 17132λ²: λλμ§κ° μ 보μ¬μ μ¬λΌμ¨ μ΄μ - νμ΄μ¬ (0) | 2023.08.06 |