Cod sursa(job #1564242)

Utilizator robx12lnLinca Robert robx12ln Data 9 ianuarie 2016 14:39:14
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<fstream>
#include<vector>
#include<deque>
#include<cstring>
const int INF = 0x3f3f3f3f;
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int D[17][2005],C[20][20],a[2005],k,n,m,w[20],x,y,z;
char f[2005];
vector< pair<int,int> > v[2005];
deque<int> d;
int bf( int st, int dr ){
    d.push_back(st);
    a[st] = 0;
    memset(a,INF,sizeof(a));
    while( !d.empty() ){
        int nod = d.front();
        f[nod] = 1;
        for( int i = 0; i < v[nod].size(); i++ ){
            int vecin = v[nod][i].first;
            if( a[vecin] > a[nod] + v[nod][i].second  ){
                a[vecin] = a[nod] + v[nod][i].second;
                if( f[vecin] == 0 ){
                    f[vecin] = 1;
                    d.push_back(vecin);
                }
            }
        }
        f[nod] = 0;
        d.pop_front();
    }
    return a[dr];
}
int hamilton( int conf, int i){
    if( conf == 1 && i == 0 ){
        return 0;
    }
    if( D[conf][i] != 0 ){
        return D[conf][i];
    }else{
        D[conf][i] = INF;
        int conf1 = conf - (1<<i);
        for( int j = 0; j < k ; j++  ){
            if( (conf1>>j) & 1 == 1 ){
                D[conf][i] = min( D[conf][i], hamilton(conf1,w[j]) + C[w[j]][i] );
            }
        }
        return D[conf][i];
    }
}
int main(){
    fin >> n >> m >> k;
    w[0] = 0;
    w[k+1]= n - 1;
    for( int i = 1; i <= k; i++ ){
        fin >> w[i];
        w[i]--;
    }
    k+=2;
    for( int i = 1; i <= m; i++ ){
        fin >> x >> y >> z;
        x--; y--;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    memset( C, INF,sizeof(C) );
    for( int i = 0; i < k ; i++ ){
        for( int j = i + 1; j <= k ;j++ ){
            if( w[i] != w[j] )
            C[i][j] = C[j][i] = bf( w[i],w[j] );
        }
    }
    hamilton( (1<<k) - 1, n );
    fout << D[(1<<k) - 1][n];
    return 0;
}