結果
| 問題 |
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 = 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))