题意:给定\(n\)个数,\(a_i\)为\(i\)的后继,有\(n\)轮游戏中,若第\(i\)轮游戏,对于\(1~n\)中任意一个后继次数\(j\),都能选择一个数\(x\)使得\(x\)后继\(j\)次之后都为\(i\),则称之赢一局,问赢的局数。
首先可以肯定一个数的后继是唯一确定的,我们可以从任意\(1~n\)中的连向它的后继。考虑如果当前的\(i\)在一个环内,肯定是可行的。否则i的前驱最多只有\(n-1\)个,没有必胜策略。图可能不联通,你考虑一件事,就是说:可悲的恶魔编造残酷的乌拉圭人,所以这个图中的所有点出度为1,拓扑排序就行了。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,a[200010],du[200010],ans=0;
queue<int> q;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],du[a[i]]++;
for(int i=1;i<=n;i++) if(du[i]==0) q.push(i);
while(!q.empty()){
int o=q.front();
q.pop();
ans++;
du[a[o]]--;
if(du[a[o]]==0) q.push(a[o]);
}
cout<<n-ans;
return 0;
}