結果

問題 No.1813 Magical Stones
ユーザー ああいい
提出日時 2022-03-04 23:59:23
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 3,758 bytes
コンパイル時間 203 ms
コンパイル使用メモリ 82,300 KB
実行使用メモリ 117,488 KB
最終ジャッジ日時 2024-07-18 23:00:18
合計ジャッジ時間 13,263 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 31 WA * 9
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#
#sG  num
#sG set
#Component
class SCC():
#index :0-index or 1-index
#
def __init__(self,G,index = 1):
self.G = G
self.N = len(G)
self.index = index
self.rG = self.make_reverse()
self.order = []
self.parent = [0] * self.N #
self.num = 0 #
self.build()
self.sG,self.top,self.Component = self.make_sG()
#sG set
#top sG
#Component
#
def make_reverse(self):
G = self.G
rG = [[] for _ in range(self.N)]
for v in range(self.index,self.N):
for u in G[v]:
rG[u].append(v)
return rG
def build(self):
G = self.G
rG = self.rG
parent = self.parent
order = self.order
memo = [0] * self.N
stack = []
label = 0
for v in range(self.index,self.N):
if memo[v] == 1:continue
stack.append(~v)
stack.append(v)
memo[v] = 1
while stack:
now = stack.pop()
if now >= 0:
for u in G[now]:
if memo[u] == 0:
memo[u] = 1
stack.append(~u)
stack.append(u)
else:
order.append(~now)
memo = [0] * self.N
for v in reversed(order):
if memo[v] == 1:continue
stack.append(v)
memo[v] = 1
parent[v] = label
while stack:
now = stack.pop()
for u in rG[now]:
if memo[u] == 1:
continue
memo[u] = 1
stack.append(u)
parent[u] = label
label += 1
self.num = label
#
#
def make_sG(self):
sG = [set() for _ in range(self.num)]
sGnum = [0] * self.num
Component = [[] for _ in range(self.num)]
G = self.G
parent = self.parent
for v in range(self.index,self.N):
Component[parent[v]].append(v)
for u in G[v]:
if parent[u] == parent[v]:continue
if parent[u] not in sG[parent[v]]:
sG[parent[v]].add(parent[u])
sGnum[parent[u]] += 1
top = []
stack = []
for i in range(self.num):
if sGnum[i] == 0:
stack.append(i)
while stack:
now = stack.pop()
top.append(now)
for v in sG[now]:
sGnum[v] -= 1
if sGnum[v] == 0:
stack.append(v)
return sG,top,Component
N,M = map(int,input().split())
G = [[] for _ in range(N + 1)]
for _ in range(M):
a,b = map(int,input().split())
G[a].append(b)
scc = SCC(G,1)
sG = scc.sG
n = scc.num
inGnum = [0] * n
outGnum = [0] * n
for i in range(n):
for v in sG[i]:
inGnum[v] += 1
outGnum[i] += 1
import sys
if n == 1:
print(0)
exit()
_in = 0
out = 0
for i in range(n):
if inGnum[i] == 0:
_in += 1
if outGnum[i] == 0:
out += 1
print(max(_in,out))
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0