题目链接:http://codeforces.com/contest/760/problem/C
题意:一共有N个烤炉,有N个烤串,一开始正面朝上放在N个位子上。一秒之后,在位子i的串串会移动到pi位子上,并且如果bi为1,那么我们还要将烤串翻个面。现在要求每个烤串的正反两面要经历所有位置,然而现在的机制不一定能够完成任务,让你修改最少的操作,使得满足这个操作。
显然要满足只有一个环才能实现经历所有位置,而且要经历正反面所以一趟循环下来变化次数必须为奇数,不然回到原来位置时还是同样的朝向
#include <iostream>
#include <cstring>
using namespace std;
const int M = 2e5 + 10;
int p[M] , b[M];
bool vis[M];
void dfs(int x) {
vis[x] = true;
if(!vis[p[x]])
dfs(p[x]);
}
int main() {
int n;
cin >> n;
int count = 0 , ans = 0;
for(int i = 1 ; i <= n ; i++) {
cin >> p[i];
}
for(int i = 1 ; i <= n ; i++) {
cin >> b[i];
if(b[i] == 1)
ans++;
}
if(ans % 2 == 0)
count++;
memset(vis , false , sizeof(vis));
int temp = 0;
for(int i = 1 ; i <= n ; i++) {
if(!vis[i]) {
dfs(i);
temp++;
}
}
if(temp == 1)
temp--;
cout << count + temp << endl;
return 0;
}