結果
| 問題 |
No.2780 The Bottle Imp
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-06-12 11:45:30 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,985 bytes |
| コンパイル時間 | 174 ms |
| コンパイル使用メモリ | 82,016 KB |
| 実行使用メモリ | 149,720 KB |
| 最終ジャッジ日時 | 2024-06-12 11:45:42 |
| 合計ジャッジ時間 | 9,906 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 36 WA * 4 |
ソースコード
#強連結成分分解
#分解したら、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.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 = []
memo = [0] * self.N
stack = []
label = 0
for v in range(self.index,self.N):
if memo[v] == 1:continue
stack.append((v,0))
memo[v] = 1
while stack:
now,i = stack.pop()
while i < len(G[now]):
u = G[now][i]
if memo[u] == 0:
memo[u] = 1
stack.append((now,i+1))
stack.append((u,0))
break
i += 1
if i == len(G[now]):
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):
pv = parent[v]
Component[pv].append(v)
for u in G[v]:
pu = parent[u]
if pu == pv:continue
if pu not in sG[pv]:
sG[pv].add(pu)
sGnum[pu] += 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 = int(input())
G = [[] for _ in range(N)]
for _ in range(N):
m,*A = list(map(int,input().split()))
for a in A:
G[_].append(a - 1)
scc = SCC(G,0)
sG = scc.sG
flag = True
n = scc.num
memo = [0] * n
stack = [0]
memo[0] = 1
c = 1
if scc.parent[0] != scc.top[0]:flag = False
"""
for s in scc.sG:
if len(s) > 1:flag = False
"""
while stack:
now = stack.pop()
for s in sG[now]:
if memo[s] == 0:
memo[s] = 1
c += 1
stack.append(s)
if c != n:flag = False
if flag:
print('Yes')
else:
print('No')
"""
print(scc.top,scc.parent)
print(scc.sG)
print(scc.num)
"""