Dusman

Desi la o prima vedere limitele ar putea parea prea mari, problema se rezolva folosind tehnica backtracking. Pur si simplu se genereaza in ordine lexicografica primele K permutari indeplinind conditiile din enunt.

Urmatorul cod reprezinta o implementare simplista si intuitiva a problemei:

void dusman ( int l ) {
    if ( K < 0 ) {
       return ;
    }

    if ( l > N ) {
       if ( --K == 0 ) afis () ;
       return ;
    }

    for ( int i = 1; i <= N; ++i ) {
       if ( X[i] == 0 && A[ sol[l - 1] ][ i ] == 0 ) { // A[x][y] == 1 daca intre x si y exista o relatie de dusmanie
          sol[ l ] = i; 
          X[ i ] = true;
          dusman (l + 1) ;
          X[ i ] = false;
       }
}

Algoritmul merge repede si furnizeaza solutie repede datorita restrictiei ca fiecare vecin are cel mult 3 dusmani.

Ca o optimizare la acest algoritm ca de altfel la majoritatea problemelor care implica generarea permtarilor se pot folosi dancing links, dar acest lucru nu era necesar pentru obtinerea punctajului maxim.