题意:找出一个有向图中的环以及进入环的点。。(如果我没有理解错的话。。)一开始用Floyd求传递闭包,然后枚举判断竟然wa了。。于是利用题目条件,每个点出发最多一条边,,写了个最简单的。。有时间直接求联通分量来验证一下。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
typedef long long LL;
const int maxn = 1005;
int nxt[maxn];
int vis[maxn];
int pre[maxn];
bool dfs(int now) {
pre[now] = 1;
int v = nxt[now];
if (v == 0) return false;
if (pre[v]) return true;
return dfs(v);
}
int main() {
freopen("input.in", "r", stdin);
int n, tmp;
while (cin >> n) {
REP(i, 1, n) cin >> nxt[i];
memset(vis, 0, sizeof(vis));
REP(i, 1, n)
if (!vis[i]) {
memset(pre, 0, sizeof(pre));
if (dfs(i) == false) {
REP(j, 1, n)
if (pre[j]) vis[j] = 1;
}
}
int ans = 0;
REP(i, 1, n) if (vis[i]) ++ans;
cout << ans << endl;
}
return 0;
}