描述
农夫约翰有 N 头奶牛,编号 1∼N。
通过使用易拉罐和绳子构成的土制电话,它们会在约翰不注意的时候相互通信。
每头奶牛最多可以将消息转发给另一头奶牛:
对于奶牛 i,它会将自己收到的任何信息转发给奶牛 Fi(Fi 与 i 一定不同)。
如果 Fi 为 0,则奶牛 i 不转发消息。
不幸的是,奶牛们意识到来自某些奶牛的消息可能最终陷入循环之中,不断地被转发。
请确定所有奶牛中有多少只奶牛发出的消息不会永远陷入循环之中。
输入描述
第一行包含整数 N。
接下来 N 行,每行包含一个整数 Fi。
输出描述
输出发出的消息不会陷入循环的奶牛的数量。
#include <bits/stdc++.h>
using namespace std;
int f[1010], vis[1010];
int n, ans;
bool dfs(int u) {
if(vis[u]) return false;
if(f[u] == 0) return true;
vis[u] = 1;
dfs(f[u]);
}
int main() {
cin >> n;
for(int i = 1; i <= n; i ++) {
cin >> f[i];
}
for(int i = 1; i <= n; i ++) {
memset(vis, 0, sizeof vis);
if(dfs(i)) {
ans ++;
}
}
cout << ans << endl;
}