Cod sursa(job #1897301)

Utilizator AndreiFlorescuAndrei Florescu AndreiFlorescu Data 1 martie 2017 12:22:46
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>

using namespace std;

int biperm[2][10002];
bool marcat[10001];
int poz[2][10002];
int lCiclu;
int nrMut;

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

void explore (int col) {

    if (marcat[biperm[0][col]]) {
        return;
    }
    lCiclu++;
    marcat[biperm[0][col]] = 1;
    if (biperm[1][poz[1][biperm[0][col]]] == biperm[1][col]) {
        int temp = biperm[1][poz[1][biperm[0][col]]];
        biperm[1][poz[1][biperm[1][col]]] = biperm[0][poz[1][biperm[1][col]]];
        biperm[0][poz[1][biperm[1][col]]] = temp;
        nrMut++;
    }
    explore (poz[0][biperm[1][col]]);
}

int main() {
    ifstream file_in ("biperm.in");
    ofstream file_out ("biperm.out");

    int n;
    int i, j;
    int sola = 1, solb = 0;

    file_in >> n;
    for (i = 0; i < 2; i++) {
        for (j = 1; j <= n; j++) {
            file_in >> biperm[i][j];
            if (!poz[0][biperm[i][j]]) {
                poz[0][biperm[i][j]] = j;
            } else {
                poz[1][biperm[i][j]] = j;
            }
        }
    }

    for (i = 1; i <= n; i++) {
        if (!marcat[i]) {
            nrMut = 0;
            lCiclu = 0;
            explore(i);
            solb += minim (nrMut, lCiclu - nrMut);
            sola *= 2;
        }
    }

    file_out << sola << " " << solb << "\n";
    for (i = 0; i < 2; i++) {
        for (j = 1; j <= n; j++) {
            file_out << biperm[i][j] << " ";
        }
        file_out << "\n";
    }

    return 0;
}