Cod sursa(job #1336699)

Utilizator xtreme77Patrick Sava xtreme77 Data 8 februarie 2015 01:03:22
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 kb
/*
 * Code by Spiromanul
 */

# include "fstream"
# include "cstring"
# include "vector"
# include "queue"
# include "bitset"
# include "deque"

const char IN [ ] = "team.in" ;
const char OUT [ ] = "team.out" ;
const int MAX = 675 ;
const int MOD = 666013 ;

# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( int a = b ; a >= c ; -- a )

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

typedef pair < int , int > P ;

class cmp {
public :
    bool operator ( ) ( const P &a , const P &b ) const
    {
        return a.second > b.second ;
    }
};

priority_queue < P , vector < P > , cmp > H ;

int dist [ MAX ] [ MAX ] , n , home [ MAX / 10 ] , p ;

vector < P > gr [ MAX ] ;

int dp [ MAX / 10 ] [ MAX / 10 ] [ MAX / 10 ] ;

void dijkstra ( int nod , int *r )
{
    H.push ( mp ( nod , 0 ) ) ;
    FORN ( i , 1 , n )
        r [ i ] = 0x3f3f3f3f ;
    r [ nod ] = 0 ;
    while ( !H.empty ( ) )
    {
        int fata = H.top ( ).first ;
        int cost = H.top ( ).second ;
        H.pop ( ) ;
        for ( auto x : gr [ fata ] )
            if ( cost + x.second < r [ x.first ] )
            {
                r [ x.first ] = cost + x.second ;
                H.push ( mp ( x.first , r [ x.first ] ) ) ;
            }
    }
}

inline void why_RF_when_we_have_Dijkstra ( )
{
    FORN ( i , 1 , p )
        dijkstra ( home [ i ] , dist [ i ] ) ;
}

/// dp [ i ] [ j ] [ k ] = rezolvam copii i...j, si l lasam acasa pe k
/// dp [ i ] [ j ] [ k ] = min ( dp [ i ] [ k - 1 ] [ u ] + cost [ u ] [ home [ k ] ] )
                      ///+ min ( dp [ k + 1 ] [ j ] [ w ] + cost [ w ] [ home [ k ] ] )

/// sol e dp [ 1 ] [ p ] [ i ] + cost [ i ][ 1 ]

inline void relax ( int &a , int b )
{
    if ( a > b )
        a = b ;
}

inline void dynamic_programming ( int p , int n )
{
    FORN ( lungime , 2 , p )
    {
        FORN ( st , 1 , p )
        {
            int dr = st + lungime - 1 ;
            if ( dr > p )
                break ;
            FORN ( k , st , dr )
            {
                int MINU = 0x3f3f3f3f ;
                int MINW = 0x3f3f3f3f ;
                FORN ( U , st , k - 1 )
                    relax ( MINU , dp [ st ] [ k - 1 ] [ U ] + dist [ U ] [ home [ k ] ] ) ;
                FORN ( W , k + 1 , dr )
                    relax ( MINW , dp [ k + 1 ] [ dr ] [ W ] + dist [ W ] [ home [ k ] ] ) ;
                if ( MINU == 0x3f3f3f3f )
                    MINU = 0 ;
                if ( MINW == 0x3f3f3f3f )
                    MINW = 0 ;
                dp [ st ] [ dr ] [ k ] = MINW + MINU ;
            }
        }
    }
    int CET = 0x3f3f3f3f ;
    FORN ( i , 1 , p )
        relax ( CET , dp [ 1 ] [ p ] [ i ] + dist [ i ] [ 1 ] ) ;

    fout << CET << '\n' ;
}

int main ( void )
{
    int m ;
    fin >> p >> n >> m ;
    FORN ( i , 1 , m )
    {
        int x , y , cost ;
        fin >> x >> y >> cost ;
        gr [ x ].pb ( mp ( y , cost ) ) ;
        gr [ y ].pb ( mp ( x , cost ) ) ;
    }
    FORN ( i , 1 , p )
        fin >> home [ i ] ;
    why_RF_when_we_have_Dijkstra ( ) ;
    dynamic_programming ( p , n ) ;
    return 0;
}