結果
| 問題 |
No.2780 The Bottle Imp
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2024-06-07 23:42:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,786 bytes |
| コンパイル時間 | 438 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 315,272 KB |
| 最終ジャッジ日時 | 2024-12-27 14:41:41 |
| 合計ジャッジ時間 | 13,585 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 39 WA * 1 |
ソースコード
from collections import defaultdict
import sys
sys.setrecursionlimit(10 ** 6)
# n : 頂点数
# 辺 : {u: [v...]}
# return : 強連結成分のリスト (トポロジカルソート順)
def scc(n, adj) -> list:
def dfs(node, used, acc):
used[node] = True
for to in adj[node]:
if used[to]: continue
dfs(to, used, acc)
acc.append(node)
def r_dfs(node, used, g):
used[node] = True
g.append(node)
for to in radj[node]:
if used[to]: continue
r_dfs(to, used, g)
radj = defaultdict(list) # 逆辺
for k, vs in adj.items():
for v in vs:
radj[v].append(k)
acc = []
used = [False] * n
for i in range(n):
if used[i]: continue
dfs(i, used, acc)
cc = []
used = [False] * n
for node in reversed(acc):
if used[node]: continue
g = []
r_dfs(node, used, g)
cc.append(g)
return cc
N = int(input())
adj = defaultdict(list)
for i in range(N):
M, *A = list(map(int, input().split()))
for a in A:
adj[i].append(a-1)
s = scc(N, adj)
tab = [-1] * N
g = defaultdict(list)
for i, cc in enumerate(s):
for x in cc:
tab[x] = i
g[i].append(x)
def dfs(v):
used.add(v)
# 頂点 v の scc
s = set()
for cc in g[tab[v]]:
#print(f'{v=} {cc=}')
for to in adj[cc]:
# 頂点 v とは異なる scc に属する
used.add(to)
if tab[v] != tab[to]:
s.add(to)
#print(f'{v=} {s=}')
if len(s) > 1:
print('No')
exit()
if len(s) == 1:
dfs(list(s)[0])
used = set()
dfs(0)
#print(f'{len(used)=}')
if len(used) == N:
print('Yes')
else:
print('No')
norioc