题目链接: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; }