Cod sursa(job #1367503)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 1 martie 2015 21:55:04
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <vector>
#include <queue>

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

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

int N, M, K, ans = INF;
int D[MAX_K][MAX_N], dp[MAX_K][(1 << MAX_K) + 2], w[MAX_K];
vector < pair < int, int > > v[MAX_N];
queue < int > Q;

void BF(int ind, int x) {
    D[ind][x] = 0;
    Q.push(x);

    while(!Q.empty()) {
        int x = Q.front();
        Q.pop();

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

            if(D[ind][x] + c < D[ind][y]) {
                D[ind][y] = D[ind][x] + c;
                Q.push(y);
            }
        }
    }
}

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

    scanf("%d %d %d", &N, &M, &K);

    w[1] = 1;
    ++K;
    for(int i = 2; i <= K; ++i) {
        scanf("%d", &w[i]);
        if(w[i] == 1) {
            --K;
            --i;
        }
    }

    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));
    for(int i = 1; i <= K; ++i)
        BF(i, w[i]);

    memset(dp, INF, sizeof(dp));
    dp[1][1] = 0;

    for(int conf = 2; conf < (1 << K); ++conf) {
        for(int i = 1; i <= K; ++i) {
            for(int j = 1; j <= K; ++j) {
                if(conf & (1 << (j - 1)) && dp[j][conf ^ (1 << (i - 1))] + D[j][w[i]] < dp[i][conf])
                    dp[i][conf] = dp[j][conf ^ (1 << (i - 1))] + D[j][w[i]];
            }
        }
    }

    for(int i = 1; i <= K; ++i)
        if(dp[i][(1 << K) - 1] + D[i][N] < ans)
            ans = dp[i][(1 << K) - 1] + D[i][N];

    printf("%d\n", ans);

    return 0;
}