Cod sursa(job #1435699)

Utilizator bogdanciurezubogdan ciurezu bogdanciurezu Data 14 mai 2015 08:42:54
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <set>
#define nmax 2500

using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");


vector <pair <int, int> > graf[nmax], graf2[nmax];
set <pair <int, int> > S;
int v[nmax], N, M, K, costuri[nmax], dp[1 << 19][19];

const int inf = 1 <<29;

void initalizare(int nod){
    int i;
    for(i = 1; i <= N; ++i)
        costuri[i] = inf;
    costuri[nod] = 0;
}

void dijkstra(int inceput){
    int val, nod, i;


    initalizare( v[inceput] );
    S.insert( make_pair( costuri[ v[inceput] ], v[inceput] ) );


    while( !S.empty() ){

        val = ( *S.begin() ).first;
        nod = ( *S.begin() ).second;

        S.erase( *S.begin() );

        for(i = 0; i < graf[nod].size(); ++i){
            if( costuri[graf[nod][i].first] > val + graf[nod][i].second ){

                S.erase( make_pair( costuri[graf[nod][i].first], graf[nod][i].first) );
                costuri[graf[nod][i].first] = val + graf[nod][i].second;
                S.insert( make_pair( costuri[graf[nod][i].first], graf[nod][i].first) );
            }

        }
    }
    //afisare();


    for(i = 0; i <= K; ++i)
        graf2[inceput].push_back( make_pair( i, costuri[ v[i] ] ) );

}


int Hamilton(){
    int s = ( 1 << (K) ), mask, i, j, k;

    for(i = 0; i < s; ++i)
        for(j = 0; j <= K; ++j)
            dp[i][j] = inf;

    dp[0][0] = 0;

    for(mask = 0; mask < s; ++mask)
        for(j = 0; j <= K; ++j)
            if(dp[i][j] != inf){
                //g<<"ok"<<'\n';
                for(k = 0; k < graf2[j].size(); ++k){
                    if(! (mask & (1 << k) ) ){
                        int node = graf2[j][k].first;
                        dp[mask | ( 1 << k )][node] = min( dp[mask | ( 1 << k )][node], dp[mask][j] + graf2[j][k].second );
                    }
                }
            }

    int sol = inf;

    for(i = 1; i <= K; ++i)
        sol = min( sol, dp[s - 1][i] + graf2[i][K].second );

    return sol;
}


int main()
{int i, a, b, c;
    f>>N>>M>>K;

    v[0] = 1;
    for(i = 1; i <= K; ++i)
        f>>v[i];
    v[++K] = N;

    for(i = 1; i <= M; ++i){
        f>>a>>b>>c;
        graf[a].push_back(make_pair(b, c) );
        graf[b].push_back(make_pair(a, c) );
    }

    for(i = 0; i <= K; ++i)
       dijkstra( i );

    if(K == 1){
        g<<graf2[1][0].second<<'\n';
        return 0;
    }

    g<<Hamilton()<<'\n';

    return 0;
}