公式

B - 友達関係の調査 / Investigation of Friend Relationships 解説 by sounansya


\(i=1,2,\ldots,M\) に対し、生徒 \(B_i\) から生徒 \(A_i\) へ友達申請が送られたか判定することを考えます。この送られた総数を \(S\) とすると、答えは \(\displaystyle \frac S2\) となります(全ての友達関係をちょうど \(2\) 回ずつ数えているため)。

この判定は set というデータ構造を使うと簡単に判定できます。まず入力を受け取り、set に \((A_i,B_i)\) のペアを全て入れます。その後 \(i=1,2,\ldots,M\) に対し \((B_i,A_i)\) のペアが set の中に含まれるか判定すれば良いです。

実装例(Python)

n, m = map(int, input().split())
a = [-1] * m
b = [-1] * m
for i in range(m):
    a[i], b[i] = map(int, input().split())
s = set()
for i in range(m):
    s.add((a[i], b[i]))
ans = 0
for i in range(m):
    ans += (b[i], a[i]) in s
assert ans % 2 == 0
print(ans // 2)

また、set を順に構成していき、各 \(i\) に対し \((B_i,A_i)\) が set に含まれるか判定した後 \((A_i,B_i)\) を set に入れる、という順番にするとどの友達関係もちょうど \(1\) 回ずつカウントすることができます。こちらの方が実装量も少ないです。

実装例(Python)

n, m = map(int, input().split())
a = [-1] * m
b = [-1] * m
for i in range(m):
    a[i], b[i] = map(int, input().split())
s = set()
for i in range(m):
    s.add((a[i], b[i]))
ans = 0
for i in range(m):
    ans += (b[i], a[i]) in s
assert ans % 2 == 0
print(ans // 2)

投稿日時:
最終更新: