Cod sursa(job #1239184)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 8 octombrie 2014 14:56:57
Problema A+B Scor 0
Compilator cpp Status done
Runda teme_upb Marime 1.62 kb
/// Craciun Catalin
///  Biperm2
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cmath>

#define NMax 10005

using namespace std;

ifstream f("biperm.in");
ofstream g("biperm.out");

int n;
vector<int> Vec[NMax]; /// Vecini neorientat
vector<int> OVec[NMax]; /// Vecini orientat
bool vis[NMax];
int X[NMax];
int compConexe = 0;
int Y[NMax];
int len = 0;
int sum = 0;
int sumLeft = 0;
int sumRight = 0;

inline int minim(int a, int b) { if (a<b) return a; return b; }

void dfs(int k) {

    len++;
    vis[k] = true;
    for (int i=0;i<Vec[k].size();i++) {
        if (!vis[Vec[k][i]]) {
            vis[Vec[k][i]] = true;
            bool contains = false;
            for (int j=0;j<OVec[k].size();j++) {
                if (OVec[k][j] == Vec[k][i])
                    contains = true;
            }

            if (contains)
                sumLeft++;
            else
                sumRight++;

            dfs(Vec[k][i]);
        }
    }
}

int main() {

    f>>n; memset(vis, false, sizeof(vis));
    for (int i=1;i<=n;i++)
        f>>X[i];
    for (int i=1;i<=n;i++)
        f>>Y[i];

    for (int i=1;i<=n;i++) {
        Vec[X[i]].push_back(Y[i]);
        Vec[Y[i]].push_back(X[i]);
        OVec[X[i]].push_back(Y[i]);
    }

    sumLeft = 0; sumRight = 0;
    for (int i=1;i<=n;i++) {
        if (!vis[i]) {
            len = 0;
            dfs(i);
            if (len > 1)
                compConexe++;
        }
    }
    sum = minim(sumLeft, sumRight);

    g<<(long long)powl(2, compConexe)<<' '<<sum<<'\n';

    return 0;
}