Cod sursa(job #2026587)

Utilizator robx12lnLinca Robert robx12ln Data 24 septembrie 2017 18:18:25
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#define str pair<int,int>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, D[2005][2005], k, s[15], Dp[15][32800], minim;
vector<str> v[2005];
priority_queue< str, vector<str>, greater<str> > q;
inline void dijkstra( int rad ){
    D[rad][rad] = 0;
    q.push( make_pair( 0, rad ) );
    while( !q.empty() ){

        str nod = q.top();
        q.pop();

        if( nod.first != D[rad][nod.second] ){
            continue;
        }

        for( int i = 0; i < v[nod.second].size(); i++ ){
            int vecin = v[nod.second][i].first;
            int cost = v[nod.second][i].second;
            if( D[rad][vecin] > D[rad][nod.second] + cost ){
                D[rad][vecin] = D[rad][nod.second] + cost;
                q.push( make_pair( D[rad][vecin], vecin ) );
            }
        }
    }
    return;
}
int main(){
    fin >> n >> m;
    fin >> k;
    k--;
    for( int i = 0; i <= k; i++ )
        fin >> s[i];
    for( int i = 1; i <= m; i++ ){
        int a, b, c;
        fin >> a >> b >> c;
        v[a].push_back( make_pair( b, c ) );
        v[b].push_back( make_pair( a, c ) );
    }
    memset( D, 0x3f3f3f3f, sizeof(D) );
    dijkstra( 1 );
    if( k == -1 ){
        fout << D[1][n] << "\n";
        return 0;
    }
    for( int i = 0; i <= k; i++ )
        dijkstra( s[i] );
    memset( Dp, 0x3f3f3f3f, sizeof(Dp) );
    for( int mask = 1; mask <= (1<<k); mask++ ){
        for( int j = 0; j <= k; j++ ){
            if( ( (mask>>j) & 1 ) == 1 ){
                if( mask == (1<<j) ){
                    Dp[j][mask] = D[1][ s[j] ];
                }else{
                    for( int i = 0; i <= k; i++ ){
                        if( ( (mask>>i) & 1 ) == 1 && i != j ){
                            Dp[j][mask] = min( Dp[j][mask], Dp[i][mask - (1<<j)] + D[ s[i] ][j] );
                        }
                    }
                }
            }
        }
    }
    minim = 0x3f3f3f3f;
    for( int i = 0; i <= k; i++ ){
        minim = min( minim, Dp[i][(1<<(k + 1)) - 1] + D[ s[i] ][n] );
    }
    fout << minim << "\n";
    return 0;
}