問題概要
問題ページ
-
C - Tour
問題ページへ移動する
問題文
AtCoder 国には \(1\) から \(N\) の番号がついた \(N\) 個の都市と、\(1\) から \(M\) の番号がついた \(M\) 個の道路があります。
道路 \(i\) を通ると都市 \(A_i\) から \(B_i\) へ移動することができます。都市 \(B_i\) から都市 \(A_i\) への通行はできません。
ピューマは、どこかの都市からスタートし、\(0\) 本以上の道路を使い移動して、どこかの都市をゴールとするような旅行の計画を立てようとしています。
スタート地点とゴール地点の都市の組として考えられるものは何通りありますか?
制約
- \(2 \leq N \leq 2000\)
- \(0 \leq M \leq \min(2000,N(N-1))\)
- \(1 \leq A_i,B_i \leq N\)
- \(A_i \neq B_i\)
- \((A_i,B_i)\) は相異なる
- 入力に含まれる値は全て整数である
問題の考察
ACコード
import sys
import collections
def solve():
input = sys.stdin.readline
mod = 10 ** 9 + 7
n, m = list(map(int, input().rstrip('\n').split()))
edges = [[] for _ in range(n)]
for i in range(m):
edge_a, edge_b = list(map(int, input().rstrip('\n').split()))
edges[edge_a-1].append(edge_b-1)
c = 0
for i in range(n):
ql = [[0, i]]
ql = collections.deque(ql)
fq = collections.defaultdict(int)
fq[i]
c += 1
while ql:
cost, now_edge = ql.popleft()
for next_edge in edges[now_edge]:
if next_edge not in fq:
ql.append((cost + 1, next_edge))
fq[next_edge]
c += 1
print(c)
if __name__ == '__main__':
solve()