結果
問題 | 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 |
ソースコード
#強連結成分分解#分解したら、sG を 頂点数num のグラフとして普通に扱えばいい#sG は set で作ってある#Componentに各成分を構成するもとの頂点を入れてるclass SCC():#index :0-index or 1-index#逆グラフは自動で作るdef __init__(self,G,index = 1):self.G = Gself.N = len(G)self.index = indexself.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.GrG = [[] for _ in range(self.N)]for v in range(self.index,self.N):for u in G[v]:rG[u].append(v)return rGdef build(self):G = self.GrG = self.rGparent = self.parentorder = self.ordermemo = [0] * self.Nstack = []label = 0for v in range(self.index,self.N):if memo[v] == 1:continuestack.append(~v)stack.append(v)memo[v] = 1while stack:now = stack.pop()if now >= 0:for u in G[now]:if memo[u] == 0:memo[u] = 1stack.append(~u)stack.append(u)else:order.append(~now)memo = [0] * self.Nfor v in reversed(order):if memo[v] == 1:continuestack.append(v)memo[v] = 1parent[v] = labelwhile stack:now = stack.pop()for u in rG[now]:if memo[u] == 1:continuememo[u] = 1stack.append(u)parent[u] = labellabel += 1self.num = label#縮約後のグラフを作る#トポロジカルソートもするdef make_sG(self):sG = [set() for _ in range(self.num)]sGnum = [0] * self.numComponent = [[] for _ in range(self.num)]G = self.Gparent = self.parentfor v in range(self.index,self.N):Component[parent[v]].append(v)for u in G[v]:if parent[u] == parent[v]:continueif parent[u] not in sG[parent[v]]:sG[parent[v]].add(parent[u])sGnum[parent[u]] += 1top = []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] -= 1if sGnum[v] == 0:stack.append(v)return sG,top,ComponentN,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.sGn = scc.numinGnum = [0] * noutGnum = [0] * nfor i in range(n):for v in sG[i]:inGnum[v] += 1outGnum[i] += 1import sysif n == 1:print(0)exit()_in = 0out = 0for i in range(n):if inGnum[i] == 0:_in += 1if outGnum[i] == 0:out += 1print(max(_in,out))