CodeForces 760 C. Pavel and barbecue(dfs+思维)

题目链接: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;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6612828.html