Cod sursa(job #1367469)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 1 martie 2015 21:33:41
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <vector>
#include <queue>

#include <cstdio>
#include <cstring>
using namespace std;

const int MAX_N = 2002;
const int MAX_K = 15;
const int INF = 0x3f3f3f3f;

int N, M, K;
int D[MAX_N][(1 << (MAX_K + 1)) + 2], a[MAX_N];
vector < pair < int, int > > v[MAX_N];
queue < pair < int, int > > Q;

int main() {
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);

    scanf("%d %d %d", &N, &M, &K);
    for(int i = 1; i <= N; ++i)
        a[i] = -1;
    for(int i = 1; i <= K; ++i) {
        int x;

        scanf("%d", &x);
        a[x] = i - 1;
    }
    for(int i = 1; i <= M; ++i) {
        int x, y, c;

        scanf("%d %d %d", &x, &y, &c);

        v[x].push_back(make_pair(y, c));
        v[y].push_back(make_pair(x, c));
    }

    memset(D, INF, sizeof(D));

    int conf = 0;
    if(a[1] != -1)
        conf ^= (1 << a[1]);
    D[1][conf] = 0;
    Q.push(make_pair(1, conf));

    while(!Q.empty()) {
        int x = Q.front().first, conf = Q.front().second;
        Q.pop();

        for(int i = 0; i < v[x].size(); ++i) {
            int y = v[x][i].first, c = v[x][i].second, conf1 = conf;

            if(a[y] != -1 && (conf1 & (1 << a[y])) == 0)
                conf1 ^= (1 << a[y]);

            if(D[x][conf] + c < D[y][conf1]) {
                D[y][conf1] = D[x][conf] + c;
                Q.push(make_pair(y, conf1));
            }
        }
    }

    printf("%d\n", D[N][(1 << K) - 1]);

    return 0;
}