Cod sursa(job #1854733)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 23 ianuarie 2017 10:43:56
Problema Count Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <set>
#define N 30010

using namespace std;

set < int > muc [ N ];
int comp [ 5 ];
int grad [ N ];
int viz [ N ];


set < int > ::iterator it1 ;
int nrsol  ;
int fin ;





void back4 ( int nod , int k ){
    static int nrvec , i ;
    set < int > ::iterator it ;

    if ( k == fin ){
        nrsol ++ ;
        return ;

    }



    comp [ k ] = nod ;

    for ( it = muc[ nod ].begin() ; it!= muc[ nod ].end() ; it ++ ){

        if ( viz [ *it ] ){
            continue ;
        }
        if ( *it < nod && k >= 2 ){
            continue ;
        }

        nrvec = 0 ;
        for ( i = 1 ; i <= k ; i ++ ){
            if ( muc [ *it ].find( comp [ i ] ) != muc [ *it ].end()  ){
                nrvec ++ ;
            }
        }

        if ( nrvec - k ){
            continue ;
        }

        back4 ( *it , k + 1 );



    }




}

int nrnod;

void solve ( int nod , int maxfin ){
    set < int > ::iterator it1 ;

    back4 ( nod , 1 );
    viz [ nod ] = -1 ;
    for  ( it1 = muc[ nod ].begin() ; it1 != muc[ nod ].end() ; it1++ ){
        grad [ *it1 ] -- ;
        if ( grad [ *it1 ] < 6 && !viz[ *it1 ]  ){
            solve( *it1 , maxfin );
        }
    }
    nrnod -- ;


}

int main(){
    int n , m , i ;
    int x ,y ;

    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);

    scanf("%d%d",&n,&m);

    for ( i = 0 ; i < m ; i++ ){
        scanf("%d%d",&x,&y);

        muc[ x ].insert( y );
        muc[ y ].insert( x );

        grad [ x ] ++ ;
        grad [ y ] ++ ;

    }

    nrnod = n ;
    fin = 4 ;
    while ( nrnod ){

        for ( i = 1 ; i <= n ; i ++){
            if ( grad [ i ] < 6 && !viz [ i ] ){

                solve ( i , fin );


            }
        }

    }

    if ( nrsol ){
        printf("4 %d",nrsol);
        return 0 ;
    }

    nrnod = n ;
    memset ( viz , 0 , sizeof ( viz ) );
    for ( i = 1 ; i <= n ; i ++ ){
        grad[ i ] = muc[ i ].size();
    }
    fin = 3 ;

    while ( nrnod ){

        for ( i = 1 ; i <= n ; i ++){
            if ( grad [ i ] < 6 && !viz [ i ] ){

                solve ( i , fin);
            }
        }

    }

    if ( nrsol  ){
        printf("3 %d",nrsol );
        return 0;
    }


    memset ( viz , 0 , sizeof ( viz ) );

    for ( i = 1 ; i <= n ; i ++ ){
        for ( it1 = muc [ i ].begin ( ) ; it1 != muc[ i ].end( ) ; it1 ++ ){
            if ( viz [ *it1 ] ){
                nrsol ++ ;
            }
        }
        viz [ i ] = -1 ;
    }


    printf("2 %d",nrsol);

    return 0;
}