Codeforces 1249B2 Books Exchange (hard version)

思路:

1.用并查集的思想,将每个cycle认为成一个集合;
2.对于某个人来说,book回到他手上的次数就是他所属集合的人数;

代码:

#include<bits/stdc++.h>
#define N 200010
using namespace std;
int kds[N];
bool vis[N];
map<int,int> mp;
vector<vector<int>> v;
vector<int> vv;
void dfs(int index){
	if(vis[index]) return;
	vis[index]=true;
	mp[index]=v.size();
	vv.push_back(kds[index]);
	dfs(kds[index]);
}
int main(){
	int q;
	cin>>q;
	for(int i=0;i<q;i++){
		int n;
		cin>>n;
		memset(kds,0,sizeof(kds));
		memset(vis,false,sizeof(vis));
		mp.clear();
		v.clear();
		for(int j=1;j<=n;j++) cin>>kds[j];
		for(int j=1;j<=n;j++){
			if(vis[j]) continue;
			vv.clear();
			dfs(j);
			v.push_back(vv);
		}
		cout<<v[mp[1]].size();
		for(int j=2;j<=n;j++) cout<<' '<<v[mp[j]].size();
		putchar('
');
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308937.html