結果
| 問題 |
No.1813 Magical Stones
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-01-23 08:43:26 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 604 ms / 2,000 ms |
| コード長 | 2,285 bytes |
| コンパイル時間 | 197 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 119,376 KB |
| 最終ジャッジ日時 | 2024-11-29 04:39:49 |
| 合計ジャッジ時間 | 14,254 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
# 強連結成分分解(SCC): グラフGに対するSCCを行う
# 入力: <N>: 頂点サイズ, <G>: 順方向の有向グラフ
# 出力: (<ラベル数>, <各頂点のラベル番号>)
def scc(N, G):
order = []
used = [False]*N
group = [None]*N
RG = [[] for _ in range(N)]
for i in range(N):
for j in G[i]:
RG[j].append(i)
def dfs(pos):
stack = [(1, pos), (0, pos)]
while stack:
t, pos = stack.pop()
if t == 0:
if used[pos]:
stack.pop()
continue
used[pos] = True
for npos in G[pos]:
if not used[npos]:
stack.append((1, npos))
stack.append((0, npos))
else:
order.append(pos)
def rdfs(pos, col):
stack = [pos]
group[pos] = col
used[pos] = True
while stack:
pos = stack.pop()
for npos in RG[pos]:
if not used[npos]:
used[npos] = True
group[npos] = col
stack.append(npos)
for i in range(N):
if not used[i]:
dfs(i)
used = [False]*N
label = 0
for s in reversed(order):
if not used[s]:
rdfs(s, label)
label += 1
return label, group
# 縮約後のグラフを構築
def construct(N, G, label, group):
G0 = [set() for i in range(label)]
GP = [[] for i in range(label)]
for v in range(N):
lbs = group[v]
for w in G[v]:
lbt = group[w]
if lbs == lbt:
continue
G0[lbs].add(lbt)
GP[lbs].append(v)
return G0, GP
n, m = map(int, input().split())
edges = [[] for _ in range(n)]
for _ in range(m):
a, b = map(int, input().split())
a -= 1
b -= 1
edges[a].append(b)
label, group = scc(n, edges)
if label == 1:
print(0)
exit()
g0, gp = construct(n, edges, label, group)
in_ = [0] * label
out_ = [0] * label
for i in range(label):
for j in g0[i]:
out_[i] += 1
in_[j] += 1
c1 = sum(i == 0 for i in in_)
c2 = sum(o == 0 for o in out_)
print(max(c1, c2))