Cod sursa(job #1895799)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 28 februarie 2017 11:04:58
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define N 2010
#define K 16
#define INF 1<<30

using namespace std;

vector < pair< int , int > > Edges[ N ];
vector < pair< int , int > >::iterator it ;
int NrNodes , NrEdges, NrImp;
int val [ N ];
int dist [ 1<< ( K + 1 ) ] [ N ];

int main(){
    int x , y , cost , i ,j ;

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

    scanf("%d%d",&NrNodes, &NrEdges);

    scanf("%d",&NrImp);
    for( i = 1 ; i <= NrImp ; i ++ ){
        scanf("%d",&x);
        val[ x ] = 1<<i ;
    }

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

        Edges [ x ].push_back ( make_pair( y , cost ));
        Edges [ y ].push_back ( make_pair( x , cost ));

    }

    for( i = 0 ; i < 1<< ( NrImp + 1 ) ; i ++ ){
        for ( j = 1 ; j <= NrNodes ; j++ ){
            dist [ i ] [ j  ] = INF ;
        }
    }


    dist [ 0 ][ 1 ] = 0 ;

    for ( j = 1 ; j <= NrNodes ; j ++){
        for ( i = 0 ; i < (1<< (NrImp + 1 )) ; i ++ ) {
            if ( dist [ i ][ j ] == INF ){
                continue;
            }
            for ( it = Edges [ j ].begin() ; it != Edges [ j ].end() ; it ++ ){

                x = it->first ;
                if( val [ x ] == 0 ){
                    dist [ i ][ x ] = min ( dist [ i ][ x ] , dist [ i ][ j ]+ it->second  );
                    continue ;
                }

                if( val[ x ] & i ){
                    continue ;
                }

                dist [ i + val [ x ] ][ x ] = min ( dist [ i + val [ x ] ][ x ] , dist [ i ][ j ]+ it->second );
            }
        }
    }

    int SolMin = INF ;
//    for ( j = 1 ; j <= NrNodes ; j++ ){
//        SolMin = min ( SolMin , dist [ (1<< ( NrImp +1 ) ) -2][ j ] );
//    }

    printf("%d",dist [ (1<< ( NrImp +1 ) ) -2][ NrNodes ] );

    return 0;
}