http://codeforces.com/problemset/problem/760/C
题意看上去很复杂,整理出来就是给出一张有向图,并且起点和终点都是1-n里的数字且不重复,每次操作可以将一个数字换成另一个数字,求操作几次可以满足该图是完全图,因为起点的数字不会出现2次以上,终点也是如此,所以只要看这张图有几个环就可以了,并且这些环是不会相切的,环的个数是1则不用操作,如果大于1则多少个环就需要操作多少次。
#include<bits/stdc++.h>
using namespace std;
int ans;
int ans1;
int ma[222222];
bool vis[222222];
void dfs(int x)
{
if(vis[ma[x]]==1){
ans1++;
}
else {
vis[ma[x]]=1;
dfs(ma[x]);
}
}
int main(){
int n,m,k;
while(scanf("%d",&n)!=EOF)
{
ans=0;
ans1=0;
memset(ma,0,sizeof(ma));
memset(vis,0,sizeof(vis));
int _0=0;
int i;
int a;
for(i=1;i<=n;i++)
{
cin>>a;
ma[i]=a;
}
for(i=1;i<=n;i++)
{
cin>>a;
if(a==1)_0++;
}
if(_0%2==0)ans++;
for(i=1;i<=n;i++)
{
if(vis[i]==0)
{
vis[i]=1;
dfs(i);
}
}
if(ans1>1)
ans+=ans1;
else ans+=ans1-1;
cout<<ans<<endl;
}
return 0;
}