公式

A - 噂の広がり / Spread of Rumors 解説 by MMNMM


初心者の方へ

それぞれの生徒が現在噂を知っているかどうかを配列などで管理し、for 文などを使って \(M\) 件の記録を順に処理することでこの問題を解くことができます。

実装例は以下のようになります。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;

    // know[i] := 出席番号 i の生徒が噂を知っている
    vector<int> know(N);
    know[0] = 1; // はじめは出席番号 0 の生徒が噂を知る
    for (int i = 0; i < M; ++i) {
        int a, b;
        cin >> a >> b;
        if (know[a]) { // 出席番号 a の生徒が噂を知っていれば
            know[b] = 1; // 出席番号 b の生徒が噂を知る
        }
    }

    int ans = 0;
    for (int i = 0; i < N; ++i) {
        ans += know[i];
    }
    cout << ans << endl;
    return 0;
}
N, M = map(int, input().split())

# know[i] := 出席番号 i の生徒が噂を知っている
know = [0 for i in range(N)]
know[0] = 1 # はじめは出席番号 0 の生徒が噂を知る
for i in range(M):
    a, b = map(int, input().split())
    if know[a]: # 出席番号 a の生徒が噂を知っていれば
        know[b] = 1 # 出席番号 b の生徒が噂を知る

print(sum(know))

投稿日時:
最終更新: