Cod sursa(job #1894647)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 27 februarie 2017 00:55:42
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
using namespace std;

fstream in ( "team.in" , ios::in  );
fstream out( "team.out", ios::out );

const int PMAX = 5e1 + 5;
const int NMAX = 5e2 + 5;
const int INF = 0x3f3f3f3f;

int pos[PMAX], cst[PMAX][PMAX];
int dp[PMAX][PMAX][2], dst[NMAX];

bitset<NMAX> oki;
vector<pair<int, int>> edg[NMAX];

int slv( int lft, int rgt, int val ) {
    
    if( lft > rgt || ( lft == val && rgt == val ) )
        return 0;
    
    if( dp[lft][rgt][val > rgt] != INF )
        return dp[lft][rgt][val > rgt];
    
    for( int mid = lft; mid <= rgt; ++ mid )
        dp[lft][rgt][val > rgt] = min( dp[lft][rgt][val > rgt],
                                       cst[val][mid] + slv( lft, mid - 1, mid ) +
                                                       slv( mid + 1, rgt, mid ) );

    return dp[lft][rgt][val > rgt];
}

int main( void ) {
    ios::sync_with_stdio( false );
    
    int p, n, m;
    in >> p >> n >> m;
    
    for( int i = 1; i <= m; ++ i ) {
        int x, y, z;
        in >> x >> y >> z;
        
        edg[x].push_back( make_pair( y, z ) );
        edg[y].push_back( make_pair( x, z ) );
    }
    
    pos[0] = 1;
    for( int i = 1; i <= p; ++ i )
        in >> pos[i];
    
    for( int i = 0; i <= p; ++ i ) {
        fill( dst, dst + n + 1, INF );
        
        oki.reset(); dst[pos[i]] = 0;
        for( int j = 1, x = 0; j <= n; ++ j, x = 0 ) {
            for( int k = 1; k <= n; ++ k )
                if( oki[k] == false && dst[k] < dst[x] )
                    x = k;
            
            oki[x] = true;
            for( pair<int, int> y : edg[x] )
                if( dst[y.first] > dst[x] + y.second )
                    dst[y.first] = dst[x] + y.second;
        }
        
        for( int j = 0; j <= p; ++ j )
            cst[i][j] = cst[j][i] = dst[pos[j]];
    }
    
    for( int i = 0; i < PMAX; ++ i )
        for( int j = 0; j < PMAX; ++ j )
            dp[i][j][0] = dp[i][j][1] = INF;
    
    out << slv( 1, p, 0 ) << endl;
    return 0;
}