[ABC296E] Transition Game

发布时间 2023-07-28 13:24:27作者: 星河倒注

题意:给定\(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;
}