解题思路
贪心思想,首先建图后每个入度为零的点一定不选,瞎j8画图后发现如果一个点不选,它限制的点一定是选了最优。因为每个点只有一个出度,选到最后一定剩若干个简单环,大小为n的环一定可以选n/2个点,然后统计答案就好了。
代码:
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<queue>
using namespace std;
queue<int>q;
int to[1000005],r[1000005],vis[1000005];
int n,ans,pans;
void dfs(int x){
pans++;vis[x]=0;
if(vis[to[x]]==-1) dfs(to[x]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&to[i]);
r[to[i]]++;vis[i]=-1;
}
for(int i=1;i<=n;i++)
if(!r[i]) {q.push(i);vis[i]=0;}
while(!q.empty()){
int x=q.front();q.pop();
if(vis[to[x]]!=-1) continue;
r[to[x]]--;
if(!vis[x] || !r[to[x]]){
vis[to[x]]=vis[x]^1;
q.push(to[x]);
}
}
for(int i=1;i<=n;i++){
if(vis[i]==1) ans++;
else if(vis[i]==-1){
pans=0;dfs(i);
ans+=pans/2;
}
}
printf("%d",ans);
return 0;
}