题意
给出一些元素,它们被某些元素限制。求最多能取出多少个元素使得有可以限制这些元素的元素没被取。
思路
我们把这些限制关系连边,可以发现是环套树,且只有进环没有出环。
那么我们可以分别对树和环进行处理。
如果是树,从入度为
0
0
0的点进入,相隔一个来选。
如果是环,最多能取环上元素个数
/
2
/2
/2个元素。
代码
#include<cstdio>
int N, ans;
int v[1000001], next[1000001], rd[1000001];
int main() {
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%d", &next[i]);
rd[next[i]]++;
}
for (int i = 1; i <= N; i++) {
if (!v[i] && !rd[i]) {//入度为0点进入
v[i] = 1;
if (!v[next[i]]) {
v[next[i]]--;
rd[next[i]]--;
rd[next[next[i]]]--;
ans++;
for (int j = next[next[i]]; !rd[j] && !v[j]; j = next[next[j]]) {//隔一个来选
v[j] = 1;
if (!v[next[j]]) {
v[next[j]] = 1;
rd[next[j]]--;
rd[next[next[j]]]--;
ans++;
}else break;
}
}
}
}
int sum;
for (int i = 1; i <= N; i++) {
if (!v[i] && rd[i]) {
sum = 1;
v[i] = 1;
for (int j = next[i]; j != i; j = next[j]) {
sum++;
v[j] = 1;
}
ans += sum / 2;//找环
}
}
printf("%d", ans);
}