結果

問題 No.3463 Beltway
コンテスト
ユーザー detteiuu
提出日時 2026-02-28 15:41:53
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
WA  
実行時間 -
コード長 2,634 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

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])
0