Skip to content

置换环 ​

cpp
void solve(){
	int n,m;
	cin>>n>>m;
	vector<int> a(n+1),deg(n+1);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		deg[a[i]]++;
	}
	if(m==1){
		for(int i=1;i<=n;i++){
			if(a[i]!=i){
				cout<<"NO\n";
				return;
			}
		}
		cout<<"YES\n";
		return;
	}
	vector<bool> vis(n+1);
	auto dfs=[&](auto self,int x)->void{
		if(--deg[a[x]]==0&&!vis[a[x]]){
			vis[a[x]]=1;
			self(self,a[x]);
		}
	};
	for(int i=1;i<=n;i++){
		if(deg[i]==0&&!vis[i]){
			vis[i]=1;
			dfs(dfs,i);
		}
	}
	for(int i=1;i<=n;i++){
		if(vis[i])continue;
		int cnt=1;
		vis[i]=1;
		for(int j=a[i];!vis[j];j=a[j]){
			vis[j]=1;
			cnt++;
		}
		if(cnt!=m){
			cout<<"NO\n";
			return;
		}
	}
	cout<<"YES\n";
}