Cod sursa(job #1501615)

Utilizator BLz0rDospra Cristian BLz0r Data 13 octombrie 2015 17:59:21
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;

#define Nmax 2002
#define Cmax 65540
#define Kmax 20
#define inf 0x3f3f3f3f

FILE *f = fopen ( "ubuntzei.in", "r" );
FILE *g = fopen ( "ubuntzei.out", "w" );

int N, M, K, Dist[Kmax][Nmax], D[Cmax][Kmax], v[Kmax];
priority_queue < pair < int, int > > Heap;
vector < pair < int , int > > G[Nmax];

void Dijktrsa ( int ind, int start ){
    for ( int i = 1; i <= N; ++i )
        Dist[ind][i] = inf;

    Dist[ind][start] = 0;
    Heap.push ( make_pair ( 0, start ) );

    vector < pair < int , int > > :: iterator it;

    while ( !Heap.empty() ){
        int nod = Heap.top().second;
        Heap.pop();

        for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
            int now = it -> first;
            int cost = it -> second;
            if ( Dist[ind][now] > Dist[ind][nod] + cost ){
                Dist[ind][now] = Dist[ind][nod] + cost;
                Heap.push ( make_pair ( -Dist[ind][now], now ) );
            }
        }
    }
}

int main(){

    fscanf ( f, "%d%d%d", &N, &M, &K );

    v[0] = 1;
    for ( int i = 1; i <= K; ++i )
        fscanf ( f, "%d", &v[i] );

    int x, y, c;

    for ( int i = 1; i <= M; ++i ){
        fscanf ( f, "%d%d%d", &x, &y, &c );
        G[x].push_back ( make_pair ( y, c ) );
        G[y].push_back ( make_pair ( x, c ) );
    }

    K++;
    for ( int i = 0; i < K; ++i )
        Dijktrsa( i, v[i] );

    memset ( D, inf, sizeof ( D ) );

    D[1][0] = 0;
    for ( int i = 1; i < ( 1 << K ); ++i ){
        for ( int j = 0; j < K; ++j ){
            if ( i & ( 1 << j ) ){
                for ( int k = 0; k < K; ++k ){
                    if ( k != j && ( i & ( 1 << k ) ) )
                        D[i][j] = min ( D[i][j], D[i^(1<<j)][k] + Dist[k][v[j]] );
                }
            }
        }
    }

    int Sol = inf;

    for ( int i = 0; i < K; ++i )
        Sol = min ( Sol, D[(1<<K)-1][i] + Dist[i][N] );

    fprintf ( g, "%d", Sol );

    return 0;
}