結果
問題 | No.1813 Magical Stones |
ユーザー |
![]() |
提出日時 | 2021-12-22 14:01:09 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 478 ms / 2,000 ms |
コード長 | 2,280 bytes |
コンパイル時間 | 174 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 111,712 KB |
最終ジャッジ日時 | 2024-09-16 08:36:30 |
合計ジャッジ時間 | 11,485 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 |
ソースコード
import sysinput = sys.stdin.readline"""強連結成分分解(SCC)from : https://github.com/ryusuke920/kyopro_educational_90_python/blob/main/solve_python/021.pyref : https://manabitimes.jp/math/1250"""class SCC:def __init__(self, n):self.n = nself.graph = [[] for _ in range(n)]self.rev_graph = [[] for _ in range(n)]self.labels = [-1] * nself.lb_cnt = 0#グラフに有向辺を追加(逆向きのものを含む)def add_edge(self, v, nxt_v):self.graph[v].append(nxt_v)self.rev_graph[nxt_v].append(v)#SCCグラフの構成def build(self):self.post_order = []self.used = [False] * self.nfor v in range(self.n):if(not self.used[v]):self._dfs(v)for v in reversed(self.post_order):if(self.labels[v] == -1):self._rev_dfs(v)self.lb_cnt += 1#SCCグラフを作る上でのDFSdef _dfs(self, v):stack = [v, 0]while(stack):v, idx = stack[-2:]if not idx and self.used[v]:stack.pop()stack.pop()else:self.used[v] = Trueif idx < len(self.graph[v]):stack[-1] += 1stack.append(self.graph[v][idx])stack.append(0)else:stack.pop()self.post_order.append(stack.pop())#逆向きDFSdef _rev_dfs(self, v):stack = [v]self.labels[v] = self.lb_cntwhile stack:v = stack.pop()for nxt_v in self.rev_graph[v]:if self.labels[nxt_v] != -1:continuestack.append(nxt_v)self.labels[nxt_v] = self.lb_cnt#構成し終えたSCCグラフを連結成分ごとにリストにするdef construct(self):self.dag = [[] for i in range(self.lb_cnt)]self.groups = [[] for i in range(self.lb_cnt)]for v, lb in enumerate(self.labels):for nxt_v in self.graph[v]:nxt_lb = self.labels[nxt_v]if lb == nxt_lb:continueself.dag[lb].append(nxt_lb)self.groups[lb].append(v)return self.dag, self.groups"""Main Code"""n,m = map(int, input().split())scc = SCC(n)for _ in [0] * m:a,b = map(int, input().split())a -= 1; b -= 1scc.add_edge(a,b)scc.build()dag,_ = scc.construct()t = len(dag)if(t == 1):print(0)exit(0)source = [True] * tsink = [True] * tfor i in range(t):for j in dag[i]:sink[i] = source[j] = Falseans = max(sum(source),sum(sink))print(ans)