結果
| 問題 | No.3463 Beltway |
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2026-02-28 15:41:53 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,634 bytes |
| 記録 | |
| コンパイル時間 | 382 ms |
| コンパイル使用メモリ | 77,652 KB |
| 実行使用メモリ | 246,672 KB |
| 最終ジャッジ日時 | 2026-02-28 15:53:50 |
| 合計ジャッジ時間 | 8,733 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 11 WA * 6 |
ソースコード
from types import GeneratorType
from collections import deque
def bootstrap(f, stack=[]):
def wrappedfunc(*args, **kwargs):
if stack:
return f(*args, **kwargs)
to = f(*args, **kwargs)
while True:
if type(to) is GeneratorType:
stack.append(to)
to = next(to)
else:
stack.pop()
if not stack:
break
to = stack[-1].send(to)
return to
return wrappedfunc
class LowLink:
def __init__(self, N):
self.N = N
self.M = 0
self.G = [[] for _ in range(N)]
def add_edge(self, u, v):
self.G[u].append((v, self.M))
self.G[v].append((u, self.M))
self.M += 1
@bootstrap
def dfs(self, n, parent):
self.visited[n] = True
self.ord[n], self.low[n] = self.cnt, self.cnt
self.cnt += 1
is_ap = False
child = 0
for v, idx in self.G[n]:
if not self.visited[v]:
child += 1
yield self.dfs(v, idx)
self.low[n] = min(self.low[n], self.low[v])
if parent != -1 and self.ord[n] <= self.low[v]:
is_ap = True
if self.ord[n] < self.low[v]:
self.bridge.append(idx)
elif idx != parent:
self.low[n] = min(self.low[n], self.ord[v])
if parent == -1 and 2 <= child:
is_ap = True
if is_ap:
self.articulation_points.append(n)
yield
def find(self):
self.ord = [-1]*self.N
self.low = [-1]*self.N
self.visited = [False]*self.N
self.cnt = 0
self.articulation_points = []
self.bridge = []
for i in range(self.N):
if not self.visited[i]:
self.dfs(i, -1)
return sorted(self.articulation_points), sorted(self.bridge)
N, M, S, G = map(int, input().split())
G = [[] for _ in range(N)]
LL = LowLink(N)
for i in range(M):
u, v = map(int, input().split())
u, v = u-1, v-1
G[u].append((v, i))
G[v].append((u, i))
LL.add_edge(u, v)
_, bridge = LL.find()
F = [True]*M
for b in bridge:
F[b] = False
dp = [-1]*N
visited = [-1]*N
dp[0] = 0
visited[0] = 0
que = deque()
que.append(0)
while que:
n = que.popleft()
for v, eidx in G[n]:
if visited[v] == -1:
visited[v] = visited[n]+1
dp[v] = dp[n]+F[eidx]
que.append(v)
elif visited[v] == visited[n]+1:
dp[v] = max(dp[v], dp[n]+F[eidx])
print(dp[-1])
detteiuu