公式

B - メッセージの転送 / Message Forwarding 解説 by MtSaka


問題文通りにメッセージを転送していきます。既に受け取ったかどうかを持つ長さ \(N\) の配列 \(V\) を用意し、\(V_1=1\) それ以外は \(V_i=0\) と初期化します。メンバー \(i\) がメッセージを受け取るたびに \(V_i=1\) と更新してメッセージの転送が終わるまでシミュレーションしていきます。最後に \(V_i=1\) となる \(i\) の個数が答えとなります。

このシミュレーションは while 文で行えます。毎ループでは、既に受け取ったかどうかの判定をして受け取っているなら break し、そうでないなら一旦 \(P_i\) にメッセージを転送していきます。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> p(n);
    for (auto& e : p) cin >> e;
    for (auto& e : p) e--;
    vector<int> vis(n, 0);
    int now = 0;
    while (!vis[now]) {
        vis[now] = 1;
        now = p[now];
    }
    cout << count(vis.begin(), vis.end(), 1) << endl;
}

投稿日時:
最終更新: